Может быть, этот способ просмотра массивов прояснит разницу:
В первом случае 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'