Numpy重复将`nan`转换为`str`

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Numpy重复将`nan`转换为`str`相关的知识,希望对你有一定的参考价值。

这种笨拙的行为似乎有点奇怪。

>>> type(np.array([1, np.nan]).repeat(2)[2])
<class 'numpy.float64'>

但是当我把第一个参数变成一个字符串时

>>> type(np.array(["a", np.nan]).repeat(2)[2])
<class 'numpy.str_'>

我如何解决它?

答案

也许这种查看数组的方式会使差异更加清晰:

在第一种情况下,np.nan是一个浮点数,因此所有元素都是浮点数:

In [310]: np.array([1, np.nan]).repeat(2)                                            
Out[310]: array([ 1.,  1., nan, nan])
In [311]: _.dtype                                                                    
Out[311]: dtype('float64')

在第二个,有一个字符串,不能成为一个浮点数,所以整个数组的dtype是字符串 - 包括np.nan现在是'nan':

In [312]: np.array(["a", np.nan]).repeat(2)                                          
Out[312]: array(['a', 'a', 'nan', 'nan'], dtype='<U3')
In [313]: _.dtype                                                                    
Out[313]: dtype('<U3')

repeat与此无关。这是np.array如何从列表中构建一个数组,选择最好的常见dtype

In [321]: np.array(["a", np.nan],dtype=float)                                        
--------------------------------------------------------------------------- 
ValueError: could not convert string to float: 'a'
另一答案

来自documentation

dtype:数据类型,可选

数组所需的数据类型。如果没有给出,那么类型将被确定为保持序列中的对象所需的最小类型。此参数只能用于“upcast”数组。对于向下转换,请使用.astype(t)方法。

在你的第一个例子中,1numpy.nan可以被投射到numpy.float64;在第二个str(即str(numpy.nan) = 'nan'最终在你的阵列中)。

以上是关于Numpy重复将`nan`转换为`str`的主要内容,如果未能解决你的问题,请参考以下文章

Python\Numpy:将数组与 NAN 进行比较 [重复]

在javascript中获取NaN而不是数字[重复]

将具有 nan 值的 str 类型字典转换为字典类型对象

NumPy 或 Pandas:将数组类型保持为整数,同时具有 NaN 值

Numpy整数nan [重复]

用numpy nan查找列表的最大值[重复]