我的代码中有一个错误,我用最简单的例子重新创建了它:
import numpy as np
zeros_4d = np.zeros((5,10,15,1))
zeros_3d = np.zeros((10,15,1))
ones_3d = zeros_3d + 1
bool_array = np.arange(0,15,1)>8
zeros_3d[:,9:,:] = ones_3d[:,9:,:] # This works fine
zeros_3d[:,bool_array,:] = ones_3d[:,bool_array,:] # This works fine
zeros_4d[0,:,9:,:] = ones_3d[:,9:,:] # This works fine
for i in np.arange(0,5,1):
zeros_4d[0,i,bool_array,:] = ones_3d[i,bool_array,:] # This works fine and does what I want
zeros_4d[0,:,bool_array,:] = ones_3d[:,bool_array,:] # This does not work
我收到以下错误消息:"ValueError:形状不匹配:形状(10,6.2(的值数组无法广播到形状(6,10,2(的索引结果">
我不明白为什么会发生这种情况,我能做些什么来解决这个问题吗?或者循环是最好的方法。
zeros_4d[0,:,bool_array,:]
索引是基本索引和高级索引的混合,在中间有一个切片。这是一个特殊的记录案例,docs.scipy.org/doc/numpy/reference/……所有切片维度都被推到布尔索引之后的末尾。
所以用你的4d形状和混合指数:
In [213]: arr = np.ones((5,10,15,2),int)
In [214]: arr[0,:, [1,2,3],:].shape
Out[214]: (3, 10, 2)
我们可以通过首先选择领先的维度来解决这个问题:
In [216]: arr[0][:, [1,2,3],:].shape
Out[216]: (10, 3, 2)
In [217]: arr[0][:, [1,2,3],:] = 2
In [218]: arr
Out[218]:
array([[[[1, 1],
[2, 2],
[2, 2],
...,
[1, 1],
[1, 1],
[1, 1]],
...
如果第一个索引生成的是副本而不是视图,则在分配期间拆分索引可能会出现问题。但这里arr[0]
是一个视图,所以它是可以的