#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.