numpy IndexError: 当用另一个矩阵索引矩阵时,索引过多

7

我有一个矩阵a,创建方式如下:

>>> a = np.matrix("1 2 3; 4 5 6; 7 8 9; 10 11 12")

我有一个矩阵标签,是这样创建的:

>>> labels = np.matrix("1;0;1;1")

这是两个矩阵的样子:
>>> a
matrix([[ 1,  2,  3],
        [ 4,  5,  6],
        [ 7,  8,  9],
        [10, 11, 12]])
>>> labels
matrix([[1],
        [0],
        [1],
        [1]])

您可以看到,当我选择所有列时,没有问题。

>>> a[labels == 1, :]
matrix([[ 1,  7, 10]])

但当我尝试指定一列时,出现了错误。

>>> a[labels == 1, 1]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/site-packages/numpy/matrixlib/defmatrix.py", line 305, in     __getitem__
    out = N.ndarray.__getitem__(self, index)
IndexError: too many indices for array
>>>   

有人知道这是为什么吗? 我知道已经有类似的问题,但是没有一个能够很好地解释我的问题,也没有一个答案对我有帮助。


1
标签是二维的,但索引使用它就像它是一维的。 - seberg
4
实际上,第一个索引也是错误的,对于numpy >=1.8,您在那里将会得到相同的错误。 - seberg
1个回答

6

由于labels是一个矩阵,当你执行labels==1时,你会得到一个相同形状的布尔矩阵。然后执行a[labels==1, :]将只返回与匹配行对应的第一列。请注意,你的意图是获取:

matrix([[ 1,  2,  3],
        [ 7,  8,  9],
        [10, 11, 12]])

尽管 NumPy < 1.8(如 @seberg 所指出的那样)可以工作,但未实现所需内容(你只得到了第一列)。为了获得想要的结果,您可以使用 labels 的扁平视图。
a[labels.view(np.ndarray).ravel()==1, :]

1
很好,我发现对于大多数np工作,2D数组表现更好。有很多人出于matlab背景的默认使用矩阵而不是数组。顺便说一下:我在1.7中得到了相同的行为。 - Phil Cooper
labels.view(np.ndarray) 将 labels 的类型更改为 np.ndarray,而 ravel 调用将数组展平。注意,可以省略 ==1 - Mr_and_Mrs_D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接