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

时间:2019-04-20 16:38:58

标签: python pandas numpy numpy-ndarray

这种麻木的行为似乎有点奇怪。

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

但是当我将第一个参数设为字符串时

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

我该如何解决?

2 个答案:

答案 0 :(得分:5)

也许这种查看数组的方式可以使区别更加清晰:

在第一种情况下,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'

答案 1 :(得分:3)

来自documentation

  

dtype:数据类型,可选

     

所需的数组数据类型。如果未指定,则将类型确定为容纳对象所需的最小类型   序列。此参数只能用于“上载”阵列。   对于向下转换,请使用.astype(t)方法。

在第一个示例中,

1numpy.nan可以强制转换为numpy.float64;在第二秒中,str(即str(numpy.nan) = 'nan'最终出现在您的数组中)。