Я новичок в NumPy и SciPy. В отличие от Matlab, кажется, что есть тип данных, связанный с каждым массивом в NumPy.

Предположим, что у нас есть целочисленный массив x:

import numpy as np
x = np.array([1, 2, 3])

Если я хочу преобразовать массив в float, то похоже, что работает следующее:

y1 = x.astype('float64')  # Works!
y2 = x.astype('float_')   # Works!
y3 = x.astype('float')    # Works!

Но я несколько озадачен тем, что следующее также работает без одинарных кавычек.

y4 = x.astype(float)      # Still works!!

Но для других выражений, используемых для y1 и y2, если я опущу одиночную кавычку, это не сработает:

y5 = x.astype(float64)  # Doesn't work.
y6 = x.astype(float_)   # Doesn't work.

Итак, я несколько озадачен тем, почему у4 работает, но у5 и у6 вызывают ошибку. Может ли кто-нибудь просветить меня об этом?

9
chanwcom 16 Дек 2015 в 22:16

3 ответа

Лучший ответ

Другие выражения работают, вам просто нужно импортировать типы из numpy. Вам не нужно делать это для float, потому что это встроенный тип для Python.

y5 = x.astype(np.float64)
y6 = x.astype(np.float_)

Входные данные как строкового, так и типового типа внутренне преобразуются в объект numpy.dtype, что вы видите при использовании атрибута ndarray.dtype.

7
Martin Valgur 16 Дек 2015 в 19:35

Читая документацию astype:

dtype : str or dtype
    Typecode or data-type to which the array is cast.

Когда вы используете float без кавычек, вы используете dtype. Когда вы используете "float", то вы используете str.

float64 и float_ не являются dtypes в Python.

1
tglaria 16 Дек 2015 в 19:22

Эти 2 не работают, потому что в вашей рабочей области нет переменных с такими именами:

y5 = x.astype(float64)  # Doesn't work.
y6 = x.astype(float_)   # Doesn't work.

Я получил NameError: name 'float64' is not defined. Ошибка генерируется интерпретатором Python, прежде чем что-либо передается в метод x.astype.

Вы получите ту же ошибку, если просто наберете float64 в интерактивном переводчике.

np.float64 работает, потому что в пространстве имен np есть такая переменная. Это на самом деле класс NumPy.

float также работает. Это тоже класс, базовый класс Python (его также можно использовать как функцию, преобразующую строку или число в объект с плавающей точкой).

'float64' - это строка, которую astype понимает, вероятно, просматривая что-то в таблице. (Я мог бы это посмотреть).

С другой стороны, если я даю astype что-то случайную строку, я получаю другую ошибку

In [967]: A.astype('bar')
...
TypeError: data type "bar" not understood

np.dtype('bar') выдает ту же ошибку.

np.dtype(float)
np.dtype('float64')
np.dtype('float')

Все возвращают один и тот же dtype('float64') объект.

3
hpaulj 16 Дек 2015 в 20:35