2014-02-26 29 views
13

如果行= nan0,我想刪除表中的所有值。Numpy:刪除全部爲0或0的值

我知道有一種方法可以做到這一點使用大熊貓即pandas.dropna(how = 'all')但我想一個numpy的方法與所有nan0刪除行。

這是否有效實施?

+0

第一個似乎是最好的選擇。 – Black

回答

16
import numpy as np 

a = np.array([ 
    [1, 0, 0], 
    [0, np.nan, 0], 
    [0, 0, 0], 
    [np.nan, np.nan, np.nan], 
    [2, 3, 4] 
]) 

mask = np.all(np.isnan(a) | np.equal(a, 0), axis=1) 
a[~mask] 
+2

因爲我不熟悉numpy,我認爲'[foo]'是一個就地刪除操作符。 Jaime的文章清楚地表明,這會創建一個需要重新分配的新陣列。 – Annan

6

這將刪除這些都是零的所有行,或所有的NaN:

mask = np.all(np.isnan(arr), axis=1) | np.all(arr == 0, axis=1) 
arr = arr[~mask] 

,這將刪除這些都是零或NaN的所有行:

mask = np.all(np.isnan(arr) | arr == 0, axis=1) 
arr = arr[~mask] 
2

我像這種方法

import numpy as np 

arr = np.array([[ np.nan, np.nan], 
       [ -1., np.nan], 
       [ np.nan, -2.], 
       [ np.nan, np.nan], 
       [ np.nan, 0.]]) 
mask = (np.nan_to_num(arr) != 0).any(axis=1) 

出:

>>> arr[mask] 
... array([[ -1., nan], 
      [ nan, -2.]]) 
0

另外:如果你想刪除的行,如果行有一個男或0中的任何一個值

a = np.array([ 
    [1, 0, 0], 
    [1, 2, np.nan], 
    [np.nan, np.nan, np.nan], 
    [2, 3, 4] 
]) 

mask = np.any(np.isnan(a) | np.equal(a, 0), axis=1) 
a[~mask] 

輸出

array([[ 2., 3., 4.]])