2012-08-06 58 views
3

我有兩個numpy數組,其維數爲(120,360),其中一個數組由整數和零組成,第二個數組由浮點數組成。我想在第一個數組中有一個整數的情況下用nans替換第二個數組的值。有沒有一個簡單而有效的方法來做到這一點?比較兩個numpy數組並插入nans

另外,我想用nans替換第一個數組中的整數,並將零變爲1。提前致謝。

回答

5

您可以用邏輯的索引到陣列中輕鬆實現這一點,

arr2[ arr1 != 0 ] = numpy.NaN 

然而整數數組不支持NaN的,所以你不得不您的第一個數組轉換成int數組,即

arr1 = arr1.astype(float) 
arr1[arr1 != 0.0] = numpy.NaN 
arr1[arr1 == 0.0] = 1.0 
+0

謝謝,有沒有類似的方式來做到這一點,爲第二部分沒有創建一個新的數組? – pter 2012-08-06 21:07:33

+0

@pter:在哪裏創建了一個新數組?你仍然只有'arr1'和'arr2' – jmetz 2012-08-06 21:08:25

+0

(雖然承認'astype'語句創建了arr1的副本,但我們然後再將它分配給arr1) – jmetz 2012-08-06 21:09:42

2

設置陣列:

>>> import numpy as np 
>>> x = np.array([[1,0],[0,4]], dtype=int) 
>>> y = np.array([[1.1, 2.2],[3.3, 4.4]], dtype=float) 

可以容易地設置所述第二陣列以NA n其中你想,像這樣:

>>> y[x != 0] = np.nan 
>>> y 
array([[ nan, 2.2], 
     [ 3.3, nan]]) 

然後轉換頭陣列漂浮(因爲陳楠不是整數),並設置所需的值:

>>> x = x.astype(float) 
>>> x[x != 0] = np.nan 
>>> x[x == 0] = 1 
>>> x 
array([[ nan, 1.], 
     [ 1., nan]]) 
0

像前評論答案,我不認爲比較浮動與==是一個好主意,我認爲有些操作被浪費了。怎麼樣創建一個臨時數組mask = (X != 0)並將其用作索引?

>>> X = X.astype(float) 
>>> X[~mask] = np.nan 
>>> X[mask] = 1 
0

我不知道你用的NaN替換值的目的,但你可能要考慮使用numpy的的蒙面數組來代替(類似於皮埃爾的答案,但numpy的具有內置面膜的支持!):

import numpy.ma 
# mask out values when there is a non-zero integer in arr1 
arr2 = numpy.ma.masked_array(arr2, mask=arr1) 
# mask out values in arr2 for non-zero integers, and set all remaining values (the zeros) to 1 
arr1 = numpy.ma(arr1, mask=(arr1 != 0)) 
arr1[~arr1.mask] = 1 

沒有需要浮點轉換的整數,這使您可以使用很多numpy的功能而不會出現問題。例如,用NaN計算一個數組的平均值肯定是一個壞主意,帶有一個掩碼數組,這是沒有問題的。