具有列矩阵的numpy二维矩阵的动态索引

时间:2018-02-27 05:06:16

标签: python numpy

我有一个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。

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