我正在编写代码,一个问题突然浮现在脑海。因此,基本上我有一个带有形状的3D numpy数组
(2, 5, 5)
和一个带有形状的2D numpy数组(2, 4)
(这只是一个例子,数组可能更大)。我需要用[:, 2:, 2:]
2D数组中的值替换3D数组(slice )的子数组中的值1。我考虑过要从要在3D数组中更改的值获取索引,然后在2D数组中使用for循环遍历这些值,但是我不确定这是否有效,而且我我得到一个错误。
import numpy as np
arr = np.array([[[0., 1., 43., 25., 21.],
[0., 0., 0., 0., 0.],
[0., 43., 0., 1., 0.],
[0., 43., 1., 0., 1.],
[0., 45., 0., 1., 0.]],
[[0., 1., 38., 29., 46.],
[0., 0., 0., 0., 0.],
[0., 32., 0., 0., 1.],
[0., 26., 0., 0., 1.],
[0., 30., 1., 1., 0.]]])
values = [[2, 3, 1, 4],
[4, 1, 5, 9]]
indexes = np.argwhere(newarr[:, 2:, 2:] == 1) + [0, 2, 2]
# indexes = [[0 2 3]
# [0 3 2]
# [0 3 4]
# [0 4 3]
# [1 2 4]
# [1 3 4]
# [1 4 2]
# [1 4 3]]
for i in values:
arr[indexes] == i
#Error
#index 2 is out of bounds for axis 0 with size 2
我想要的输出应该是
newarr = [[[0., 1., 43., 25., 21.],
[0., 0., 0., 0., 0.],
[0., 43., 0., 2., 0.],
[0., 43., 3., 0., 1.],
[0., 45., 0., 4., 0.]],
[[0., 1., 38., 29., 46.],
[0., 0., 0., 0., 0.],
[0., 32., 0., 0., 4.],
[0., 26., 0., 0., 1.],
[0., 30., 5., 9., 0.]]])
我认为仅使用numpy应该会有更高的效率,但是我看不到该怎么做,因此我们将不胜感激,谢谢!
您可以切片arr
并使用实际的二进制值强制转换bool
以掩盖数组,并在存在1
s的情况下切片分配:
a_view = arr[:,2:,2:]
a_view[a_view.astype('bool')] = np.array(values).ravel()
print(arr)
array([[[ 0., 1., 43., 25., 21.],
[ 0., 0., 0., 0., 0.],
[ 0., 43., 0., 2., 0.],
[ 0., 43., 3., 0., 1.],
[ 0., 45., 0., 4., 0.]],
[[ 0., 1., 38., 29., 46.],
[ 0., 0., 0., 0., 0.],
[ 0., 32., 0., 0., 4.],
[ 0., 26., 0., 0., 1.],
[ 0., 30., 5., 9., 0.]]])
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句