如果我想将一个函数逐行(或逐列)应用于ndarray,我会看看ufuncs(看起来不像)或某种类型的数组广播(不是我正在寻找的)要么?)?
修改
我正在寻找类似R的应用功能。例如,
apply(X,1,function(x) x*2)
将通过匿名定义的函数将2乘以X的每一行,但也可以是命名函数。 (这当然是一个愚蠢的,人为的例子,实际上并不需要apply
)。没有通用的方法在NumPy数组的“轴”上应用函数,?
答案 0 :(得分:14)
首先,许多numpy函数采用axis
参数。通过这种方法可能(并且更好)做你想做的事。
但是,通用的“将此功能逐行应用”方法看起来像这样:
import numpy as np
def rowwise(func):
def new_func(array2d, **kwargs):
# Run the function once to determine the size of the output
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)