首先,很多 numpy 函数都有一个 axis
参数。使用这种方法可能可以更好地实现你想要的结果。
然而,一种通用的“按行应用函数”的方法看起来像这样:
import numpy as np
def rowwise(func):
def new_func(array2d, **kwargs):
val = func(array2d[0], **kwargs)
output_array = np.zeros((array2d.shape[0], val.size), dtype=val.dtype)
output_array[0] = val
for i,row in enumerate(array2d[1:], start=1):
output_array[i] = func(row, **kwargs)
return output_array
return new_func
@rowwise
def test(data):
return np.cumsum(data)
x = np.arange(20).reshape((4,5))
print test(x)
请记住,我们只需使用以下代码即可完成完全相同的操作:
np.cumsum(x, axis=1)
通常有一种更好的方法可以使用numpy来实现,而不是使用通用方法。
编辑:
我完全忘记了这一点,但上面的方法本质上等同于 numpy.apply_along_axis
。
因此,我们可以将其重写为:
import numpy as np
def test(row):
return np.cumsum(row)
x = np.arange(20).reshape((4,5))
print np.apply_along_axis(test, 1, x)
apply
相当于numpy.vectorize
。虽然如此,使用它几乎总是一个坏主意...我从来没有见过你必须使用vectorize
而不能重写函数直接操作ND数组的情况。(它很可能比R的apply
不够灵活。我只是玩过R
,从未深入使用过。)在您的示例中,您只需编写result = X * 2
即可。 - Joe KingtonX*2
,这就是我说它很傻的原因 :)。 - hatmatrixapply
有点不同。你可以让 numpy 的vectorize
操作行(将数组视为结构化数组,然后每个元素是一个向量),但这比它值得的麻烦多了(而且通常不比在行上进行 for 循环更快)。 - Joe Kingtonapply_along_axis
在Python中循环。请查看源代码:https://github.com/numpy/numpy/blob/master/numpy/lib/shape_base.py 无论如何,调用Python函数的开销很大,因此将循环移动到C中不会带来太大差异。(可能会稍微快一些。)即使您从C中调用Python函数,其开销也相当昂贵。 - Joe Kington