【问题标题】:Dynamic indexing of numpy 2D matrix with column matrixnumpy 2D矩阵与列矩阵的动态索引
【发布时间】:2018-02-27 05:06:15
【问题描述】:

我有一个 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,:] 这样的东西。但我得到 too many indices for array 错误。我只是想获得:

B = matrix([[1,2,3],
            [4,5,6],
            [7,8,9]])

删除A 的最后一行,因为M 的最后一行是0。我确信这很容易,但我不知道该怎么做。

我在 Python 3.5.2 上使用 Numpy 1.11.2。

【问题讨论】:

    标签: python numpy


    【解决方案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 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]])
    

    【讨论】:

      【解决方案2】:

      使用熊猫。这就是它的小巷

      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
      

      【讨论】:

      • 谢谢,实际上我想在不使用任何其他包的情况下缝合到 numpy。无论如何,我会看看熊猫。
      • 使用类固醇是麻木的。如果你在 python 中建模数据。值得学习曲线。
      【解决方案3】:

      我找到了一个像这样工作的解决方案

      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]])
      

      【讨论】:

        猜你喜欢
        • 2019-10-20
        • 2018-01-02
        • 1970-01-01
        • 2016-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多