Довольно сложно отследить действие скомпилированного кода numpy.Даже если вы можете найти метод astype
, вам, вероятно, придется выкопать несколько слоев вниз, чтобы увидеть, что вы хотите.Вероятно, метод top фокусируется на интерпретации параметров, тогда как само преобразование может происходить в совершенно другом разделе кода.
Обратите внимание, что ваш массив имеет тип object
dtype именно из-за этого объекта None
.Другие элементы являются целыми числами,
In [48]: np.array([1,2,None])
Out[48]: array([1, 2, None], dtype=object)
Если я скажу ему сделать массив int
dtype, то возникнет ошибка:
In [49]: np.array([1,2,None],int)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-49-c65114b3ba97> in <module>()
----> 1 np.array([1,2,None],int)
TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'
Это та же ошибка, что и яПолучив int(None)
.
Указав float
dtype, я получу nan
, как и вы.По сути, этот вызов np.array
такой же, как ваш метод astype
.(Видите, что я имею в виду, что трудно точно определить, где выполняется «преобразование»?)
In [50]: np.array([1,2,None],float)
Out[50]: array([ 1., 2., nan])
Теперь float(None)
вызывает аналогичную ошибку, поэтому обработка numpy
для None
отличается от Python.
numpy
также преобразует строку 'nan' в число с плавающей точкой nan
:
In [56]: np.array([1,2,'nan'],float)
Out[56]: array([ 1., 2., nan])
Не удивительно, что None
преобразуется в число с плавающей точкой nan
,В конце концов, это означает not a number
.Но будет довольно трудно найти точное место (или места) в коде numpy
, в котором эта эквивалентность сделана.