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