传递要素以有效发挥作用

时间:2019-03-31 14:33:56

标签: python function numpy numpy-broadcasting

我有一个大小为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])

2 个答案:

答案 0 :(得分:0)

您可以使用List Comprehension列出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 :(得分:0)

由于您正在修改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

但是如果函数过于复杂,那么它的评估时间可能会相对较长(与迭代机制相比)。