在将代码复制到问题时似乎有一些错误。
但是我怀疑索引存在一个已知问题:
In [73]: a=np.zeros((2,3,4)); b=np.ones((3,4)); I=np.array([0,1])
制作
I2个元素。标引
b给出预期的(3,2)形状。切片中的3行,
I索引中的2列
In [74]: b[:,I].shapeOut[74]: (3, 2)
但是使用3d,
a我们可以获得转置。
In [75]: a[0,:,I].shapeOut[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]].shapeOut[86]: (4, 2, 3)
发生同样的事情
a[0,:,[0,1]]。但是有一个很好的论点,那就是不应该这样。
至于修复,您可以转置值或更改索引
In [88]: b[:,I]=a[0:1,:,I]In [90]: b[:,I]=a[0,:,I].TIn [91]: bOut[91]: array([[ 0., 0., 1., 1.], [ 0., 0., 1., 1.], [ 0., 0., 1., 1.]])In [92]: b[:,I]=a[0][:,I]
https://github.com/numpy/numpy/issues/7030
https://github.com/numpy/numpy/pull/6256



