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

8
无法使用numpy在字符串数组中找到nan条目,我的代码如下:
for x in X_cat:
    if x == np.nan:
        print('Found')

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


3
为什么不使用 https://docs.scipy.org/doc/numpy/reference/generated/numpy.isnan.html? - Mohamed Ali JAMAOUI
因为 np.nan == np.nan 返回 False - Daniel F
1
@MedAli 因为根据问题描述,这是一个字符串数组。 - BlackJack
6个回答

5
在字符串数组中,你只能执行字符串比较。 你必须以字符串格式初始化nan。
nan_str = str_np.array([np.nan]).astype(str)[0]

通过按照您所描述的初始化数组的方式进行初始化:

只需在方括号内输入要存储的元素,元素之间用逗号分隔即可:

x = np.array(['hello', np.nan, 'world', np.nan], dtype=object)

然后您可以用我假定为mostcommonstring的最常见字符串来替换这些nan

x[np.where(x.astype(str)==str_nan)]='mostcommonstring'

4

这是因为将任何NaN进行比较,包括NaN本身,都会返回False。因此,即使xnp.nanprint也不会运行。(实际上,这曾经是一种检查是否为NaN的可接受方法,因为没有其他IEEE754浮点值具有该属性。)

使用np.isnan(x)来检查x是否为NaN


7
问题是isnan在字符串上不能正常工作,如果我尝试:np.isnan('l'),会出现TypeError: ufunc 'isnan' not supported for the input types的错误,而且根据转换规则''safe'',输入无法安全地强制转换为任何支持的类型。 - Peter Lynch

2

由于声望不够,无法对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'


1
您需要使用np.isnan来检查x是否为NaN:
for x in X_cat:
    if np.isnan(x):
        print('Found')

np.nan == np.nan 返回 False,因此直接比较在这里是没有意义的。了解更多关于isnan的信息,请参见numpy文档


0

NaN 有时被程序员用作方便的“填充物”,可以像数字一样静默传播。但在数学上,NaN 表示诸如 0/0 的表达式,其实质上可以是任何数字(如果 a = 0/0a*0=0,因此a 可以是任何值)。

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

当你涉及到 naninf 值时,相等性是一个奇怪的概念(尝试理解 1+2+3+4+5+...=-1/12)。只需使用提供的函数,如np.isnan即可。


-1

你无法在字符串数组中找到np.nan,因为np.nan是一个数字,而不是一个字符串,numpy数组中的所有元素必须具有相同的类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接