Numpy:使用布尔数组索引将3d矩阵放入4d矩阵时出现形状不匹配错误-python



我的代码中有一个错误,我用最简单的例子重新创建了它:

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]是一个视图,所以它是可以的

最新更新