2017-03-02 44 views
0

h是我的矩陣如何從矩陣中刪除所有出現的值?

h=[[0,346,34,6,7,0,0,34634,6,0],[2352,205230,523,50,5023,502,350,0,0]] 

,我想從h刪除所有零。

所以結果應該是:

h=[[346,34,6,7,34634,6],[2352,205230,523,50,5023,502,350]] 

我嘗試了幾種不同的東西從HERE等問題,但似乎沒有任何一個矩陣工作。有沒有什麼好的解決方案?

+0

這是一個numpy的矩陣? – ZdaR

回答

2

如果您想更改矩陣就地,您可以使用類似下面的函數。訣竅是向後遍歷每行的元素,以便連續元素的索引不會因爲先前被刪除而改變。

def remove_zeros(matrix): 
    for row in matrix: 
     length = len(row)-1 
     for i, elem in enumerate(reversed(row)): 
      if not elem: # zero value? 
       row.pop(length-i) 

h = [[0, 346, 34, 6, 7, 0, 0, 34634, 6, 0], [2352, 205230, 523, 50, 5023, 502, 350, 0, 0]] 

remove_zeros(h) 

print(h) # -> [[346, 34, 6, 7, 34634, 6], [2352, 205230, 523, 50, 5023, 502, 350]] 
+0

我會用的''而不是排'逆轉(行)[:: - 1]' –

+0

@FelipeNardiBatista:當然,這會工作,也和更具有可讀性。然而,大多數「Pythonistas」會立即識別'[:: = 1]',因爲這是在內置「reverse()」語言之前通常使用的語言。 – martineau

+0

是的,但截至目前,這是更具可讀性和更有效,因爲它不會複製行,它只是遍歷它 –

2

您可以簡單地使用列表理解:

h = [[element for element in row if element] for row in h]

所以在這裏我們h遍歷每個row。對於每一行我們構建一個新列表[element for element in row if element]。這意味着,在每rowelement,我們檢查,如果它等於0(與if element)。如果不是,bool(element)True,因此,我們添加element到該列表。否則,我們省略element

+0

'chain.from_iterable(h.tolist())'到位h'的'如果它是一個'numpy'矩陣。 –

+0

@NickilMaveli:你爲什麼需要'連鎖'? –

+0

這是因爲'tolist()'創建了一個額外的'list',你需要將其平鋪。 –