2017-08-10 120 views
2

在一個numpy數組中,我想將所有naninf替換爲一個固定數字。我可以在一個步驟中做到這一點,以節省計算時間(數組非常大)?python:在numpy中組合掩碼

a = np.arange(10.0) 
a[3] = np.nan 
a[5] = np.inf 
a[7] = -np.inf 
# a: [ 0. 1. 2. nan 4. inf 6. -inf 8. 9.] 

a[np.isnan(a)] = -999 
a[np.isinf(a)] = -999 
# a: [ 0. 1. 2. -999. 4. -999. 6. -999. 8. 9.] 

上面的代碼工作正常。但我正在尋找類似的東西:

a[np.isnan(a) or np.isinf(a)] = -999 

哪一個不工作,我可以看到爲什麼。只是想,如果每個項目只檢查一次可能會更好。

回答

2

這似乎工作:

a[np.isnan(a) | np.isinf(a)] = 2 

np.isnan()np.isinf()事實上返回兩個布爾numpy的陣列。

布爾numpy數組可以結合按位操作,如&和|

+0

精彩! 「或」和「|」之間有什麼區別?也許按位邏輯?順便說一下,我剛剛測試過它:組合版本更快速地變成了10%。編輯:好的,我明白了。謝謝! – offeltoffel

3

numpy的本身自帶的量化的或版本:

a[np.logical_or(np.isnan(a), np.isinf(a))] = -999 

雖然上述版本是明確understanable,有一個快一些,這是一個有點怪異:

a[np.isnan(a-a)] = -9999 

的想法這背後是,「np.inf-np.inf = np.nan`

%timeit a[np.isnan(a-a)] = -999 
# 100000 loops, best of 3: 11.7 µs per loop 
%timeit a[np.isnan(a) | np.isinf(a)] = -999 
# 10000 loops, best of 3: 51.4 µs per loop 
%timeit a[np.logical_or(np.isnan(a), np.isinf(a))] = -999 
# 10000 loops, best of 3: 51.4 µs per loop 

因此,|np.logical_or版本似乎是內部等效

+1

numpy是一件奇蹟般的事 – offeltoffel

3

你可以使用np.isfinite它證明一個數是不是無限的,也不是楠:

a[~np.isfinite(a)] = -999 
+0

這看起來也不錯! 〜做什麼? – offeltoffel

+1

'〜'是邏輯*不*。 –