In [1]: A = np.array([[1,2,3],
...: [4,5,6],
...: [7,8,9],
...: [-1,-2,-3]])
In [2]: M = np.array([[1],
...: [1],
...: [1],
...: [0]])
我切换到np.array,首选类型。
In [3]: A[M,:]
Out[3]:
array([[[4, 5, 6]],
[[4, 5, 6]],
[[4, 5, 6]],
[[1, 2, 3]]])
In [4]: _.shape
Out[4]: (4, 1, 3)
使用M 进行索引直接产生错误的形状和错误的行 - 第 1 行的多个副本和第 0 行的一个副本。
现在切换到 M 的布尔版本:
In [5]: M>0
Out[5]:
array([[ True],
[ True],
[ True],
[False]])
In [6]: A[M>0,:]
---------------------------------------------------------------------------
IndexError Traceback (most recent call
...
IndexError: too many indices for array
哎呀,它在这里咬我们的 (4,1) 形状。所以把M改成1d:
In [7]: M1 = M.ravel()
In [8]: A[M1>0,:]
Out[8]:
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
我们也可以使用where 来获取行索引:
In [9]: idx = np.where(M1)
In [10]: idx
Out[10]: (array([0, 1, 2]),)
In [11]: A[_,:]
Out[11]:
array([[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]])
如果 M 是 np.matrix, we'd have to useM.A1` 来生成一维索引数组。
Difference between numpy.matrix.A1 and ravel
In [13]: MM = np.matrix([[1],
...: [1],
...: [1],
...: [0]])
...:
...:
In [14]: MM
Out[14]:
matrix([[1],
[1],
[1],
[0]])
In [15]: MM.ravel()
Out[15]: matrix([[1, 1, 1, 0]])
In [16]: A[MM.ravel()>0,:]
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-16-2ee7cf5210f1> in <module>()
----> 1 A[MM.ravel()>0,:]
IndexError: too many indices for array
In [17]: MM.A1
Out[17]: array([1, 1, 1, 0])
In [18]: A[MM.A1>0,:]
Out[18]:
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])