有简单的方法可以将函数应用于numpy数组的子集吗?

时间:2018-12-12 10:40:56

标签: python numpy numpy-ndarray

假设我有以下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)函数可以轻松做到这一点吗?

1 个答案:

答案 0 :(得分: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])