Повторяющий символ превращает `nan` в` str` - PullRequest
0 голосов
/ 20 апреля 2019

Это глупое поведение кажется немного странным.

>>> 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 ]

5 голосов
/ 20 апреля 2019

Может быть, этот способ просмотра массивов прояснит разницу:

В первом случае 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'
3 голосов
/ 20 апреля 2019

из документации :

dtype: тип данных, необязательный

Требуемый тип данных для массива.Если не указан, то тип будет определен как минимальный тип , необходимый для хранения объектов в последовательности.Этот аргумент может быть использован только для «upcast» массива.Для понижения рейтинга используйте метод .astype (t).

в первом примере 1 и numpy.nan можно привести к numpy.float64;во втором str (т.е. str(numpy.nan) = 'nan' попадает в ваш массив).

...