但是我怀疑索引存在一个已知问题:
In [73]: a=np.zeros((2,3,4)); b=np.ones((3,4)); I=np.array([0,1])
制作I
2个元素。标引b
给出预期的(3,2)形状。切片中的3行,I
索引中的2列
In [74]: b[:,I].shape
Out[74]: (3, 2)
但是使用3d,a
我们可以获得转置。
In [75]: a[0,:,I].shape
Out[75]: (2, 3)
和分配会产生错误
In [76]: b[:,I]=a[0,:,I]
...
ValueError: array is not broadcastable to correct shape
它将2元素的尺寸由I
第一个定义,将3元素的尺寸从:
第二个定义。这是前面已经讨论过的混合高级索引的一种情况-也存在一个错误问题。(我必须查一下)。
您可能正在使用较新的numpy
(或scipy
)并获得了不同的错误消息。
据记录,索引有两个数组或列表,中间是切片,将切片放在末尾,例如
In [86]: a[[[0],[0],[1],[1]],:,[0,1]].shape
Out[86]: (4, 2, 3)
发生同样的事情a[0,:,[0,1]]
。但是有一个很好的论点,那就是不应该这样。
至于修复,您可以转置值或更改索引
In [88]: b[:,I]=a[0:1,:,I]
In [90]: b[:,I]=a[0,:,I].T
In [91]: b
Out[91]:
array([[ 0., 0., 1., 1.],
[ 0., 0., 1., 1.],
[ 0., 0., 1., 1.]])
In [92]: b[:,I]=a[0][:,I]