【问题标题】:numpy ndarrays: row-wise and column-wise operationsnumpy ndarrays:逐行和逐列操作
【发布时间】:2011-12-07 02:58:24
【问题描述】:

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

编辑

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

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

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

【问题讨论】:

  • 更容易谈论细节。你想做什么?通用的“逐行应用此函数”解决方案实际上只是一个 for 循环(迭代行或列真的很容易)。通常有更有效的方法。
  • R 的 apply 的等价物是 numpy.vectorize 的价值。但是,使用它几乎总是一个坏主意……我从未见过可以使用 vectorize 的情况,在这种情况下,您无法重写函数以直接对 ND 数组进行操作。 (它很可能不如 R 的apply 灵活。我只玩过R,从未真正深入使用过它。)在你的例子中,你只需要写result = X * 2
  • 有趣——实际上 R 也有一个矢量化函数——但要沿“轴”应用它,我必须将数组拆分为行向量列表或其他东西......但是感谢您的一般性讨论。我可能会坚持循环,因为它看起来更“普遍”。 (在 R 中,在这种情况下你也可以只做 X*2,这就是为什么我说这很愚蠢:)。
  • 啊!抱歉,我只是假设 R 的 apply 有点不同。您可以使 numpy 的 vectorize 对行进行操作(您将数组视为结构化数组,然后每个元素都是一个向量),但这比它的价值更麻烦(通常不会比行上的 for 循环快) .
  • “然后每个元素都是一个向量”的意思是,每一行都是一个元组?它会缩短代码,但不太通用,因为它只适用于行......但有趣的想法!

标签: python arrays numpy multidimensional-array


【解决方案1】:

首先,许多 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)

【讨论】:

  • 哇,非常优雅!...但基本上,对于未由 numpy 使用轴参数定义的用户定义函数执行此操作的方法是遍历行并分配给预分配的数组...
  • 是的。还有其他方法可以做同样的事情,(你甚至可以通过各种技巧让numpy.vectorize 做一些疯狂的事情)但它们最终都与上面的示例相似。不过,就像我说的那样,您通常可以将用户定义的函数转换为各种带有轴参数的 numpy 函数的组合。有时这是一种更好的方法,有时则不是。迭代(如上面的示例)通常会比“numpy-ified”版本使用更少的内存,尽管它通常更慢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-05
  • 2013-04-18
  • 1970-01-01
  • 2021-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多