这种麻木的行为似乎有点奇怪。
>>> type(np.array([1, np.nan]).repeat(2)[2])
<class 'numpy.float64'>
但是当我将第一个参数设为字符串时
>>> type(np.array(["a", np.nan]).repeat(2)[2])
<class 'numpy.str_'>
我该如何解决?
答案 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)
在第一个示例中,dtype:数据类型,可选
所需的数组数据类型。如果未指定,则将类型确定为容纳对象所需的最小类型 序列。此参数只能用于“上载”阵列。 对于向下转换,请使用.astype(t)方法。
1
和numpy.nan
可以强制转换为numpy.float64
;在第二秒中,str
(即str(numpy.nan) = 'nan'
最终出现在您的数组中)。