一個有趣的事情有關NaN
是IEEE
指定NaN
不等於什麼(包括自身)。 Numpy和Python總體上遵循這個規則。
>>> NaN = float('nan')
>>> NaN == NaN
False
>>> import numpy as np
>>> np.nan == np.nan
False
這應該解釋爲什麼你print l['k']
語句不打印過,爲什麼np.nan in a
不返回True
。
一種解決方法可能是:
>>> import numpy as np
>>> d = {np.nan: 'foo'}
>>> d[np.nan]
'foo'
>>> a = np.array([np.nan])
>>> d[a[0]]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: nan
不幸的是,有沒有:
numpy.isnan(a).any() # Check if any element in `a` is `nan`.
如果我正確理解您的評論,問題更恰當地通過下面的代碼片段展示由於NaN
的瘋狂屬性,您可以在這裏做很多事情。數組本質上是C數組,它們保存浮點數。當你有一個自由浮動np.nan
,它有一個永遠不會改變的ID(內存地址),所以Python可以通過指針比較來鎖定它。這就是爲什麼第一位使用上面的字典。
不幸的是,當您將NaN
放入數組中時,它會使用NaN
填充數組中的值。在這種情況下,該元素的ID是相對於數組中第一個元素的位置 - 所以python不能說這個NaN
與您用來構造數組的元素相同(因爲它不是)。由於ID比較現在失敗,並且由於NaN
的屬性而導致平等比較失敗,因此您運氣不佳。
至於你的價值 - >標籤轉換,你也許可以使用numpy的內建功能:
label_array = np.empty(a.shape, dtype='|S3')
label_array[np.isnan(a)] = 'NA'
label_array[a == 1] = 'one'
label_array[a == 2] = 'two'
爲中等大小的數組,這個應該足夠快...
注,如果你直接在a
中輸入那個和兩個數字,這真的只會起作用 - 如果你已經做了一些浮點數學計算來計算它們,那就不行了。例如a[n] = 5./2.5
的精度誤差可以讓你用數字非常接近2
是不太等於2
...
我的天堂」這個還沒有提到,但它真的好像你想要與numpy的m一起工作問陣列。他們幫助你避免所有這些南方問題... – mgilson