在我的代码为:
的字符串数组中使用numpy找不到nan条目for x in X_cat:
if x == np.nan:
print('Found')
我知道列表中有2个条目,但代码运行时没有打印任何内容。同样,如果我用'nan'替换np.nan我的最终目标是用最常见的字符串替换nan。
答案 0 :(得分:4)
这是因为将任何与NaN
进行比较,包括 NaN
,是False
。因此,即使x
为np.nan
,print
也不会运行。 (事实上,过去是检查某些东西是否为NaN
的可接受方式,因为没有其他IEEE754浮点值具有该属性。)
使用np.isnan(x)
检查x
是否为NaN
。
答案 1 :(得分:1)
您需要使用np.isnan检查x代表NaN:
for x in X_cat:
if np.isnan(x):
print('Found')
np.nan == np.nan
会返回False
,因此这里的直接比较毫无意义。在numpy docs
答案 2 :(得分:1)
没有足够的声誉来评论Thibaut的答案,但为了简化它:
nan-string可以是np.str_(np.nan)
甚至str(np.nan)
。
x = np.array(['hello', np.nan, 'world', np.nan], dtype=object)
x[np.where(x.astype(str)==str(np.nan))] = 'mostcommonstring'
答案 3 :(得分:0)
NaN
作为方便的“填充程序”,它可以像数字一样行动并且无声地传播。但是在数学上,NaN
表示像0/0
这样的表达式,基本上可以是任意数字(如果a = 0 / 0
,a * 0 = 0
,因此a
可以是任何数字)
除了极小的概率外,“任何可能的数字”==
“任何可能的数字”都是False
。
一旦你进入nan
和inf
值(只是试着绕过1+2+3+4+5+... = -1/12
),平等就是一个愚蠢的概念。只需使用提供的功能,如np.isnan
。
答案 4 :(得分:0)
你根本找不到字符串数组中的np.nan
,因为np.nan
是一个数字,而不是字符串,而numpy数组中的所有元素必须具有相同的类型。
答案 5 :(得分:0)
在字符串数组中,您只能执行字符串比较。 您必须以字符串格式初始化nan。
nan_str = str_np.array([np.nan]).astype(str)[0]
并通过初始化一个像您描述的那样的数组:
x = np.array(['hello', np.nan, 'world', np.nan], dtype=object)
然后您可以将这些nan
替换为我认为最常见的字符串mostcommonstring
:
x[np.where(x.astype(str)==str_nan)]='mostcommonstring'