我想知道是否有一种干净的方式来处理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])
Run Code Online (Sandbox Code Playgroud)
我原本以为它应该返回最多1纳米的值.为什么它会返回多个nan值?我想知道我在numpy数组中有多少独特的非纳米值.
谢谢
EdC*_*ica 19
您可以结合使用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.])
Run Code Online (Sandbox Code Playgroud)
至于为什么你得到多个NaN值,因为NaN无法正常比较值:
In [23]:
np.nan == np.nan
Out[23]:
False
Run Code Online (Sandbox Code Playgroud)
所以你必须用来isnan执行正确的比较
使用set:
In [24]:
set(my_array1[~np.isnan(my_array1)])
Out[24]:
{2.0, 4.0, 5.0, 6.0}
Run Code Online (Sandbox Code Playgroud)
您可以len通过以上任何一种方式调用以获得尺寸:
In [26]:
len(np.unique(my_array1[~np.isnan(my_array1)]))
Out[26]:
4
Run Code Online (Sandbox Code Playgroud)
我建议使用熊猫。我认为这是直接替换,但与 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.])
Run Code Online (Sandbox Code Playgroud)
我正在使用 numpy 1.17.4 和 Pandas 0.25.3。希望这可以帮助!