Передача элементов для эффективного функционирования - PullRequest
0 голосов
/ 31 марта 2019

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

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

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])

Ответы [ 2 ]

0 голосов
/ 31 марта 2019

Поскольку вы изменяете строку 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.]])

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

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

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

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

X+p

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

0 голосов
/ 31 марта 2019

Вы можете составить список всей первой строки Матрицы 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...