如果我想将函数按行(或按列)应用于narray,我是否要查找ufuncs(似乎不像)或某种类型的数组广播(不是我要找的?)?
编辑
我正在寻找类似R的应用函数。例如,
apply(X,1,function(x) x*2)
将通过一个匿名定义的函数乘以X的每一行,但也可以是一个命名函数。(这当然是一个愚蠢的、人为的例子,其中实际上不需要apply
)。没有通用的方法可以跨NumPy数组的"轴"应用一个函数,
首先,许多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)