numpy ndarrays:行操作和列操作
如果我想对一个ndarray(多维数组)按行或按列应用一个函数,我应该使用ufuncs(看起来不太对)还是某种数组广播(这也不是我想要的)呢?
编辑
我想找类似R语言中的apply函数的东西。例如,
apply(X,1,function(x) x*2)
这段代码会通过一个匿名定义的函数把2乘到X的每一行上,也可以用一个命名的函数。(当然,这是一个很傻的例子,实际上并不需要用到apply
)。有没有什么通用的方法可以在NumPy数组的“轴”上应用一个函数呢?
1 个回答
16
首先,很多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)