过滤列上的numpy矩阵

时间:2016-03-20 15:42:09

标签: python numpy matrix

我有一个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;也就是说,我不想得到第3个值为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]])

有没有办法过滤这个矩阵而不显式编写循环语句?

4 个答案:

答案 0 :(得分:7)

使用np.array代替np.matrix可以让您进行简单的掩码索引,如:

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

可以从np.matrix转换为np.array

a = np.asarray(a)    

答案 1 :(得分:1)

或者只是使用:

serverSocketUDP = socket(AF_INET, SOCK_DGRAM)
serverSocketTCP = socket(AF_INET, SOCK_STREAM)
#... define server...
#...
message, clientAddress = serverSocketUDP.recvfrom(2048) #why 2048 for UDP? Ive seen several examples like this.
message2 = serverSocketTCP.recv(1024) #Again, why 1024 for TCP? 

,结果是:

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

答案 2 :(得分:0)

不知何故,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矩阵的列表,我无法将其转换回良好的形状。

答案 3 :(得分:0)

我刚刚了解了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]]