【问题标题】:filtering numpy matrix on a column在列上过滤 numpy 矩阵
【发布时间】:2016-03-20 15:42:08
【问题描述】:

我有一个numpy矩阵如下:

data = np.matrix(
      "5 3 1;"
      "4 4 1;"
      "6 4 1;"
      "8 2 1;"
      "3 5 1;"
      "1 7 1;"
      "5 4 1;"
      "0 1 0;"
      "2 0 0")
# Output:
matrix([[5, 3, 1],
    [4, 4, 1],
    [6, 4, 1],
    [8, 2, 1],
    [3, 5, 1],
    [1, 7, 1],
    [5, 4, 1],
    [0, 1, 0],
    [2, 0, 0]])

我想要的是过滤第三列值为1的矩阵;也就是说,我不想得到第三个值为0的行。总之,我想提取下面的矩阵:

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

我尝试了一些组合来过滤它;但没有一个对我有用。例如,下面的代码排除了为零的行,但它只返回第一列。

data[data[:,2]>0]
#Output: 
matrix([[5, 4, 6, 8, 3, 1, 5]])

有没有办法在不显式编写循环语句的情况下过滤这个矩阵?

【问题讨论】:

    标签: python numpy matrix


    【解决方案1】:

    使用np.array 而不是np.matrix 可以让您进行简单的掩码索引,例如:

    a = a[a[:, 2] != 0]
    

    要将np.matrix 转换为np.array,您可以这样做:

    a = np.asarray(a)    
    

    【讨论】:

    • a = a.A 等效于矩阵的a = np.asarray(a)。 :)
    【解决方案2】:

    或者只是使用:

     import numpy as np
    
     a = np.matrix([[5, 3, 1],
         [4, 4, 1],
         [6, 4, 1],
         [8, 2, 1],
         [3, 5, 1],
         [1, 7, 1],
         [5, 4, 1],
         [0, 1, 0],
         [2, 0, 0]])
     ind = np.squeeze(np.asarray(a[:,2]))>0
    
     print(a[ind,:])
    

    ,结果为:

     [[5 3 1]
      [4 4 1]
      [6 4 1]
      [8 2 1]
      [3 5 1]
      [1 7 1]
      [5 4 1]]
    

    【讨论】:

      【解决方案3】:

      不知何故,np.matrix 的行为很奇怪。我对数组有效的解决方案不适用于矩阵,因为矩阵的行是 1 行矩阵。为什么要显式使用矩阵?

      嗯,这行得通:

      data = np.matrix(
            "5 3 1;"
            "4 4 1;"
            "6 4 1;"
            "8 2 1;"
            "3 5 1;"
            "1 7 1;"
            "5 4 1;"
            "0 1 0;"
            "2 0 0")
      
      data = np.array(data)
      print data[data[:, 2] > 0]
      

      我也尝试使用filter(lambda x: x[0, 2] > 0, data),它可以工作,但返回一个 1x3 矩阵列表,我无法将其转换回一个好的形状。

      【讨论】:

        【解决方案4】:

        我刚刚了解了np.where 函数并应用于此任务。该方案保留了原始数据的类型。

        a = np.matrix([[5, 3, 1],
         [4, 4, 1],
         [6, 4, 1],
         [8, 2, 1],
         [3, 5, 1],
         [1, 7, 1],
         [5, 4, 1],
         [0, 1, 0],
         [2, 0, 0]])
        row_ndx,_ = np.where(a[:,2]>0)
        a[row_ndx]
        

        或单线:

        a[np.where(a[:,2]>0)[0]]
        

        【讨论】:

          猜你喜欢
          • 2021-12-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多