我有兩個numpy數組,其維數爲(120,360),其中一個數組由整數和零組成,第二個數組由浮點數組成。我想在第一個數組中有一個整數的情況下用nans替換第二個數組的值。有沒有一個簡單而有效的方法來做到這一點?比較兩個numpy數組並插入nans
另外,我想用nans替換第一個數組中的整數,並將零變爲1。提前致謝。
我有兩個numpy數組,其維數爲(120,360),其中一個數組由整數和零組成,第二個數組由浮點數組成。我想在第一個數組中有一個整數的情況下用nans替換第二個數組的值。有沒有一個簡單而有效的方法來做到這一點?比較兩個numpy數組並插入nans
另外,我想用nans替換第一個數組中的整數,並將零變爲1。提前致謝。
您可以用邏輯的索引到陣列中輕鬆實現這一點,
arr2[ arr1 != 0 ] = numpy.NaN
然而整數數組不支持NaN的,所以你不得不您的第一個數組轉換成int數組,即
arr1 = arr1.astype(float)
arr1[arr1 != 0.0] = numpy.NaN
arr1[arr1 == 0.0] = 1.0
設置陣列:
>>> 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]])
像前評論答案,我不認爲比較浮動與==
是一個好主意,我認爲有些操作被浪費了。怎麼樣創建一個臨時數組mask = (X != 0)
並將其用作索引?
>>> X = X.astype(float)
>>> X[~mask] = np.nan
>>> X[mask] = 1
我不知道你用的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計算一個數組的平均值肯定是一個壞主意,帶有一個掩碼數組,這是沒有問題的。
謝謝,有沒有類似的方式來做到這一點,爲第二部分沒有創建一個新的數組? – pter 2012-08-06 21:07:33
@pter:在哪裏創建了一個新數組?你仍然只有'arr1'和'arr2' – jmetz 2012-08-06 21:08:25
(雖然承認'astype'語句創建了arr1的副本,但我們然後再將它分配給arr1) – jmetz 2012-08-06 21:09:42