2016-03-20 16 views
2

我有一個numpy的矩陣如下過濾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]]) 

有沒有一種方法來過濾這個矩陣,而不顯式編寫循環語句?

回答

5

使用np.array,而不是np.matrix讓你做一個簡單的面膜索引,如:

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

np.matrix轉換爲np.array,你可以這樣做:

a = np.asarray(a)  
+3

['一個= aA'](http://docs.scipy.org/doc/numpy/reference/generated/numpy.matrix.A.html#numpy.matrix.A)相當於矩陣的'a = np.asarray(a)'。 :) – MSeifert

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),它的工作原理,但返回×3矩陣,這是我不能轉換回一個好身材的列表。

1

或者只是使用:

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

,w HICH結果:

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