当我在一个numpy多维数组中进行索引时,我有一个奇怪的问题。所以,我有一个形状阵列(4,882)。我有另一个叫做形状匹配的数组(276,2)。此匹配数组保存原始多维数组中有效条目的索引。我想要做的是选择匹配数组中索引匹配的前2行和所有列。所以,我做了如下的事情:
import numpy as np
k = get_array() # This has shape (4, 882)
m = get_match() # This has shape (276, 2)
s = k[[1, 0], m[:, 0]]
这引发了错误:
ValueError: shape mismatch: objects cannot be broadcast to a single shape
然而,当我这样做时:
s = k[[1, 0], :][:, m[:, 0]]
这很好用。所以,这实际上首先选择行的子集然后选择列,但我不确定为什么我的第一次尝试是错误的。另外,做:
s = k[[1, 0], :]
当然有效。
答案 0 :(得分:2)
错误消息有点混乱,因为形状不匹配不在k
和m
之间。它位于[1, 0]
和m[:,0]
之间。以下是使用以下(更容易显示的)数组来修复它的三种方法:
>>> k
array([[ 0, 1, 2, 3, 4, 5, 6, 7],
[ 8, 9, 10, 11, 12, 13, 14, 15],
[16, 17, 18, 19, 20, 21, 22, 23]])
>>> m
array([[0, 1],
[2, 3],
[4, 5],
[6, 7]])
将索引列表更改为二维列表,其形状可以广播对m
:
>>> k[[[1], [0]],m[:, 0]]
array([[ 8, 10, 12, 14],
[ 0, 2, 4, 6]])
将其转换为数组并重塑数组:
>>> k[numpy.array([1, 0]).reshape(2, 1),m[:, 0]]
array([[ 8, 10, 12, 14],
[ 0, 2, 4, 6]])
将其转换为数组并使用numpy.newaxis
,a.k.a。None
对其进行切片:
>>> k[numpy.array([1, 0])[:,None],m[:, 0]]
array([[ 8, 10, 12, 14],
[ 0, 2, 4, 6]])
还有很多其他的,但这些是最容易想到的三个。
您收到错误是因为numpy
需要以这种方式传递的索引具有相同的形状,或者可以播放到相同的形状。通过使[1, 0]
列表成为"列数组,"你让他们播放。当您尝试将m
乘以[1, 0]
时,会发生同样的事情:
>>> m[:,0] * [0, 1]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: shape mismatch: objects cannot be broadcast to a single shape
所有相同的修复都适用。例如:
>>> m[:,0] * [[0], [1]]
array([[0, 0, 0, 0],
[0, 2, 4, 6]])
最后,请注意您也可以通过传递m
形状不同的切片来修复它 - 观察输出是否已转置:
>>> k[[1, 0],m[:, 0:1]]
array([[ 8, 0],
[10, 2],
[12, 4],
[14, 6]])