在字符串数组中使用numpy找不到nan条目

时间:2017-09-05 13:10:46

标签: python arrays numpy

在我的代码为:

的字符串数组中使用numpy找不到nan条目
for x in X_cat:
    if x == np.nan:
        print('Found')

我知道列表中有2个条目,但代码运行时没有打印任何内容。同样,如果我用'nan'替换np.nan我的最终目标是用最常见的字符串替换nan。

6 个答案:

答案 0 :(得分:4)

这是因为将任何NaN进行比较,包括 NaN,是False。因此,即使xnp.nanprint也不会运行。 (事实上​​,过去是检查某些东西是否为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

中查找有关isnan的更多信息

答案 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 / 0a * 0 = 0,因此a可以是任何数字)

除了极小的概率外,“任何可能的数字”==“任何可能的数字”都是False

一旦你进入naninf值(只是试着绕过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'