我有一个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]])
有没有办法过滤这个矩阵而不显式编写循环语句?
答案 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]]