您遇到的问题归结为矩阵返回的操作始终返回二维数组.
在第一个数组上构建掩码时,您会得到:
In [24]: a2[:,1] > 10
Out[24]: array([False, False, True, True, True], dtype=bool)
正如您所看到的,它是一维数组.
当你用矩阵做同样的事情时,你会得到:
In [25]: m2[:,1] > 10
Out[25]:
matrix([[False],
[False],
[ True],
[ True],
[ True]], dtype=bool)
换句话说,您有一个nx1数组,而不是长度为n的数组.
numpy中的索引操作会有所不同,具体取决于您是使用一维还是n维数组进行索引.
在第一种情况下,numpy会将长度为n的数组视为行索引,因此您将获得预期的结果:
In [28]: a2[a2[:,1] > 10]
Out[28]:
array([[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23],
[24, 25, 26, 27, 28, 29]])
在第二种情况下,因为你有一个二维索引数组,numpy有足够的信息来提取行和列,所以它只从匹配列(第一个)中抓取东西:
In [29]: m2[m2[:,1] > 10]
Out[29]: matrix([[12, 18, 24]])
要回答你的问题:你可以通过将掩码转换为数组并抓住第一列来获取此行为,以提取长度为n的初始数组:
In [32]: m2[np.array(m2[:,1] > 10)[:,0]]
Out[32]:
matrix([[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23],
[24, 25, 26, 27, 28, 29]])
或者,您可以先进行转换,得到与以前相同的结果:
In [34]: np.array(m2)[:,1] > 10
Out[34]: array([False, False, True, True, True], dtype=bool)
现在,这两个修复都需要在矩阵和数组之间进行转换,这可能非常难看.
我要问自己的问题是为什么你希望使用矩阵,但期望数组的行为.可能是你工作的正确工具实际上是一个数组,而不是一个矩阵.