【问题标题】:Is there an easy way to apply a function to a subset of a numpy array?有没有一种简单的方法可以将函数应用于 numpy 数组的子集?
【发布时间】:2018-12-12 19:01:13
【问题描述】:

假设我有以下 numpy 数组

>>> import numpy as np
>>> arr = np.array([[[1,2,3,4], [5,6,7,8]], [[1,2,3,4], [5,6,7,8]]])
>>> arr
array([[[1, 2, 3, 4],
        [5, 6, 7, 8]],
       [[1, 2, 3, 4],
        [5, 6, 7, 8]]])

我想将一个函数映射到数组的子部分,例如:

flip_sign = lambda x: x*(-1)

在我的示例中,我只想将此函数应用于第二行,从而产生:

array([[[1, 2, 3, 4],
        [5, 6, 7, 8]],
       [[-1, -2, -3, -4],
        [-5, -6, -7, -8]]])

本质上我想使用类似的东西

np.apply_along_axis(flip_sign, 1, arr)

但指定沿轴 0 的索引(或索引范围)应应用此函数。

当然,我可以将数组拆分为子集,然后将函数应用于子集并再次连接子集。
但是有没有内置的(numpy)函数可以轻松做到这一点?

【问题讨论】:

    标签: python numpy numpy-ndarray


    【解决方案1】:

    如果你的函数足够简单,比如标量的乘法或求和,你可以直接将它应用到数组的部分

    import numpy as np
    
    arr = np.array([[[1,2,3,4], [5,6,7,8]], [[1,2,3,4], [5,6,7,8]]])
    flip_sign = lambda x: x*(-1)
    arr[1] = flip_sign( arr[1])
    

    输出:

    [[[ 1  2  3  4]
      [ 5  6  7  8]]
    
     [[-1 -2 -3 -4]
      [-5 -6 -7 -8]]]
    

    这是因为 * + - / 的重载在 numpy 中实现的方式。如果您对数组执行任何此操作,使用标量,它将自动对数组的每个元素执行操作。

    对于更复杂的函数np.apply_along_axes可以这样使用:

    arr[1] = np.apply_along_axis( flip_sign, 0, arr[1])
    

    【讨论】:

    • 太好了,谢谢!这就是我一直在寻找的。但是有什么理由我不能用更复杂的函数来做到这一点(只要它可以将一维数组作为输入)?
    • 使用 apply_along_axes 甚至可以使用更复杂的函数来实现这一点
    猜你喜欢
    • 2020-02-16
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    • 2013-02-21
    • 2016-08-13
    相关资源
    最近更新 更多