numpy ndarrays:行操作和列操作

12 投票
1 回答
22611 浏览
提问于 2025-04-17 04:15

如果我想对一个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)

撰写回答