[英]Dynamic indexing of numpy 2D matrix with column matrix
我有一个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]])
我希望能够为M!= 0获得A的所有列,例如B=A[M!=0,:]
。 但是我得到了太多的数组错误索引 。 我只想获取:
B = matrix([[1,2,3],
[4,5,6],
[7,8,9]])
因为M
的最后一行是0,所以删除了A
的最后一行。我敢肯定这很容易,但是我不知道该怎么做。
我在Python 3.5.2上使用Numpy 1.11.2。
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索引数组。
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]])
使用大熊猫。 这是它的胡同
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
我找到了这样的解决方案
A = np.array([[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[-1, -2, -3]])
M = np.array([[1],
[1],
[1],
[0],])
>>> mask = np.concatenate(M).astype(bool)
>>> out = A[:, mask]
>>> print(out)
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.