numpy ndarrays:行式和列式操作

时间:2011-10-13 16:30:47

标签: python arrays numpy multidimensional-array

如果我想将一个函数逐行(或逐列)应用于ndarray,我会看看ufuncs(看起来不像)或某种类型的数组广播(不是我正在寻找的)要么?)?

修改

我正在寻找类似R的应用功能。例如,

apply(X,1,function(x) x*2)

将通过匿名定义的函数将2乘以X的每一行,但也可以是命名函数。 (这当然是一个愚蠢的,人为的例子,实际上并不需要apply)。没有通用的方法在NumPy数组的“轴”上应用函数,?

1 个答案:

答案 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)