我有一个2D矩阵,比如4x3,即4行乘3列。
A = matrix([[1,2,3],
[4,5,6],
[7,8,9],
[-1,-2,-3]])
我还有一个4x1的列矩阵:
M = matrix([[1],
[1],
[1],
[0]])
我希望能够获得A的所有列M!= 0,即B=A[M!=0,:]
之类的东西。但我得到数组错误的索引太多了。我只想获得:
B = matrix([[1,2,3],
[4,5,6],
[7,8,9]])
删除A
的最后一行,因为M
的最后一行是0.我确信这很容易,但我无法知道如何执行此操作。
我在Python 3.5.2上使用Numpy 1.11.2。
答案 0 :(得分:1)
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 use
M.A1`来生成1d索引数组。
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]])
答案 1 :(得分:0)
使用熊猫。这是它的小巷
import numpy as np
import pandas as pd
A = np.array([[1,2,3],
[4,5,6],
[7,8,9],
[-1,-2,-3]])
M = np.array([[1],
[1],
[1],
[0]])
dfa = pd.DataFrame(A)
dfm = pd.DataFrame(M)
seriesm = (pd.Series(dfm[dfm.columns[0]]) != 0)
matrixYouWant = dfa[seriesm.values]
如果你想要它回到一个numpy数组:
yourNewArray = matrixYouWant.values