Где я могу найти определение функции astype () от Numpy? - PullRequest
0 голосов
/ 26 сентября 2018

Я наткнулся на этот кусок кода:

np.array([1,2,None]).astype(float)

, который выдает:

array([ 1.,  2., nan])

Я хотел посмотреть, как этот код преобразует None в nan.Поэтому я искал определение функции astype в репозитории Numpy's GitHub.Не могли бы вы помочь мне найти часть, где он показывает код, используемый для преобразования None в Nan?Мне не хватает знаний Python, чтобы понять, как библиотеки, такие как Numpy, делают вещи.Посмотрев на их код, я чувствую, что не очень разбираюсь в python.

Все, что я могу найти из него, это в https://github.com/numpy/numpy/blob/464f79eb1d05bf938d16b49da1c39a4e02506fa3/numpy/lib/user_array.py#L240:

def astype(self, typecode):
        ""
        return self._rc(self.array.astype(typecode))

Я понятия не имею, как Numpy используетэта функция.Я не мог найти другое появление определения функции типа во всем хранилище.

1 Ответ

0 голосов
/ 27 сентября 2018

Довольно сложно отследить действие скомпилированного кода 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, в котором эта эквивалентность сделана.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...