如何在 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])
我原以为它应该 return 最多 1 nan 值。为什么它 return 多个 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
您可以将 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不能直接算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
我建议使用 pandas。我认为这是直接替换,但 pandas 保持原始顺序与 numpy 不同。
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 版本 1.21.0 开始,np.unique now returns single 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])
我想知道是否有一种干净的方法来处理 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])
我原以为它应该 return 最多 1 nan 值。为什么它 return 多个 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
您可以将 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不能直接算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
我建议使用 pandas。我认为这是直接替换,但 pandas 保持原始顺序与 numpy 不同。
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 版本 1.21.0 开始,np.unique now returns single 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])