繁体   English   中英

numpy 2D矩阵与列矩阵的动态索引

[英]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索引数组。

numpy.matrix.A1和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]])

使用大熊猫。 这是它的胡同

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM