簡體   English   中英

如何在 numpy 數組中找到唯一的非 nan 值?

[英]how to find the unique non nan values in a numpy array?

我想知道是否有一種干凈的方法來處理 numpy 中的 nan。

my_array1=np.array([5,4,2,2,4,np.nan,np.nan,6])
print my_array1
#[  5.   4.   2.   2.   4.  nan  nan   6.]
print set(my_array1)
#set([nan, nan, 2.0, 4.0, 5.0, 6.0])

我原以為它最多應該返回 1 nan 值。 為什么它返回多個 nan 值? 我想知道在一個 numpy 數組中有多少個唯一的非 nan 值。

謝謝

您可以使用np.unique與組合,找到獨特的價值isnan過濾NaN值:

In [22]:

my_array1=np.array([5,4,2,2,4,np.nan,np.nan,6])
np.unique(my_array1[~np.isnan(my_array1)])
Out[22]:
array([ 2.,  4.,  5.,  6.])

至於為什么你得到多個NaN值是因為NaN值不能正常比較:

In [23]:

np.nan == np.nan
Out[23]:
False

所以你必須使用isnan來執行正確的比較

使用set

In [24]:

set(my_array1[~np.isnan(my_array1)])
Out[24]:
{2.0, 4.0, 5.0, 6.0}

您可以對上述任何一項調用len以獲取大小:

In [26]:

len(np.unique(my_array1[~np.isnan(my_array1)]))
Out[26]:
4

我建議使用熊貓。 我認為這是直接替換,但與 numpy 不同,pandas 保留了原始順序。

import numpy as np
import pandas as pd

my_array1=np.array([5,4,2,2,4,np.nan,np.nan,6])

np.unique(my_array1)
# array([ 2.,  4.,  5.,  6., nan, nan])

pd.unique(my_array1)
# array([ 5.,  4.,  2., nan,  6.]) 

我正在使用 numpy 1.17.4 和 Pandas 0.25.3。 希望這可以幫助!

正如之前的答案已經指出的那樣,numpy 不能直接計算 nans,因為它無法比較 nans。 numpy.ma.count_masked是你的朋友。 例如,像這樣:

>>> import numpy.ma as ma
>>> a = np.array([ 0.,  1., np.nan, np.nan,  4.])
>>> a
np.array([ 0.,  1., nan, nan,  4.])
>>> a_masked = ma.masked_invalid(a)
>>> a_masked
masked_array(data=[0.0, 1.0, --, --, 4.0],
             mask=[False, False,  True,  True, False],
       fill_value=1e+20)
>>> ma.count_masked(a_masked)
2

您可以將isnan()與 setm 一起使用,然后遍歷 isnan() 數組的結果並刪除所有 NaN 對象。

my_array1=np.array([5,4,2,2,4,np.nan,np.nan,6])
print my_array1
#[  5.   4.   2.   2.   4.  nan  nan   6.]
print set(my_array1)
#set([nan, nan, 2.0, 4.0, 5.0, 6.0])
for i,is_nan in enumerate(np.isnan(list(my_array1))):
    if is_nan:
        del my_array1[i]

從 Numpy 1.21.0 版開始, np.unique 現在返回單個 NaN

>>> a = np.array([8, 1, np.nan, 3, np.inf, np.nan, -np.inf, -2, np.nan, 3])
>>> np.unique(a)
array([-inf,  -2.,   1.,   3.,   8.,  inf,  nan])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM