Передача элементов для эффективного функционирования

#python #function #numpy #array-broadcasting

#python #функция #numpy #массив-широковещательная передача

Вопрос:

У меня есть массив размером m x n. Я хочу передать каждую m строку по отдельности в функцию и сохранить результат в той же строке.

Каков был бы эффективный способ сделать это с помощью numpy. В настоящее время я использую циклы for для достижения этого:

 X : size(m x n)
p : size(m x n)

for i in np.arange(X.shape[0]):
    X[i] = some_func(X[i], p[i])
  

Комментарии:

1. Вы пытались передать как массив, так и номер строки?

Ответ №1:

Поскольку вы изменяете строку X , вы можете пропустить индексацию и использовать zip для итерации по строкам:

 In [833]: X=np.ones((2,3)); p=np.arange(6).reshape(2,3)                         
In [834]: for x,y in zip(X,p): 
     ...:     x[:] = x   y 
     ...:                                                                       
In [835]: X                                                                     
Out[835]: 
array([[1., 2., 3.],
       [4., 5., 6.]])
  

Если вам все еще нужен индекс, вы могли бы добавить enumerate:

 for i,(x,y) in enumerate(zip(X,p)):...
  

В этих альтернативах нет большой разницы в эффективности. Вам все равно придется вызывать свою функцию m раз. Вам все равно придется выбирать строки либо по индексу, либо по итерации. Оба работают немного медленнее в массивах, чем в эквивалентном списке.

Лучше всего написать свою функцию так, чтобы она работала непосредственно с 2d-массивами и не нуждалась в итерации.

 X p
  

Но если функция слишком сложна для этого, то время ее вычисления, вероятно, будет относительно большим (по сравнению с механизмом итерации).

Комментарии:

1. Это то, что я в итоге сделал. Просто пришлось обновить мою функцию.

Ответ №2:

Вы можете составить список всех первых строк матрицы X и p, используя представление списка, как показано ниже. Затем вы можете легко отправить первую строку X и p в качестве параметров вашему some_function

 import numpy as np

X =  np.random.randint(9, size=(3, 3))
p =  np.random.randint(9, size=(3, 3))

print(X.shape, p.shape)

XList = [i[0] for i in X]
pList = [j[0] for j in p]

print (XList)
print (pList)

for i in np.arange(XList, pList):
    X[i] = some_func(XList, pList)
  

Комментарии:

1. Это то же самое, что использовать циклы for . Я хотел знать, есть ли какой-то другой способ сделать это с помощью numpy.