lil*_*roo 7 python arrays numpy matrix
我有一个矩阵,我这样创建:
>>> a = np.matrix("1 2 3; 4 5 6; 7 8 9; 10 11 12")
Run Code Online (Sandbox Code Playgroud)
我有一个矩阵标签,我这样创建:
>>> labels = np.matrix("1;0;1;1")
Run Code Online (Sandbox Code Playgroud)
这就是两个基质的样子:
>>> a
matrix([[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12]])
>>> labels
matrix([[1],
[0],
[1],
[1]])
Run Code Online (Sandbox Code Playgroud)
如您所见,当我选择所有列时,没有问题
>>> a[labels == 1, :]
matrix([[ 1, 7, 10]])
Run Code Online (Sandbox Code Playgroud)
但是当我尝试指定列时,我收到错误
>>> 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
>>>
Run Code Online (Sandbox Code Playgroud)
有谁知道这是为什么?我知道这里已经存在类似的问题,但没有一个能够很好地解释我的问题,答案也没有对我有帮助.
因为labels
你是一个矩阵,你labels==1
得到一个相同形状的布尔矩阵.然后,do a[labels==1, :]
将只返回第一列,其中的行与对应的行相对应.请注意您的意图:
matrix([[ 1, 2, 3],
[ 7, 8, 9],
[10, 11, 12]])
Run Code Online (Sandbox Code Playgroud)
没有实现(你只得到了第一列),尽管它对NumPy <1.8起作用(正如@seberg所指出的那样).
为了获得您想要的东西,您可以使用以下平面视图labels
:
a[labels.view(np.ndarray).ravel()==1, :]
Run Code Online (Sandbox Code Playgroud)