Spec-Zone.ru › NumPy 1.18

Типы данных

См. также

Объекты типов данных

Типы массивов и преобразования между типами

NumPy поддерживает гораздо большее разнообразие числовых типов, чем Python. Этот раздел показывает, какие типы доступны и как изменить тип данных массива.

Поддерживаемые примитивные типы тесно связаны с типами в C:

Тип NumPy

Тип C

Описание

np.bool_

bool

Булево (True или False), хранится как байт

np.byte

signed char

Определяется платформой

np.ubyte

unsigned char

Определяется платформой

np.short

short

Определяется платформой

np.ushort

unsigned short

Определяется платформой

np.intc

int

Определяется платформой

np.uintc

unsigned int

Определяется платформой

np.int_

long

Определяется платформой

np.uint

unsigned long

Определяется платформой

np.longlong

long long

Определяется платформой

np.ulonglong

unsigned long long

Определяется платформой

np.half / np.float16

Половинная точность с плавающей запятой: знаковый бит, 5 бит порядка, 10 бит мантиссы

np.single

float

Определяемая платформой с плавающей запятой одинарной точности: обычно знаковый бит, 8 бит порядка, 23 бита мантиссы

np.double

double

Определяемая платформой с плавающей запятой двойной точности: обычно знаковый бит, 11 бит порядка, 52 бита мантиссы.

np.longdouble

long double

Определяемая платформой с плавающей запятой расширенной точности

np.csingle

float complex

Комплексное число, представленное двумя числами с плавающей запятой одинарной точности (действительная и мнимая компоненты)

np.cdouble

double complex

Комплексное число, представленное двумя числами с плавающей запятой двойной точности (действительная и мнимая компоненты).

np.clongdouble

long double complex

Комплексное число, представленное двумя числами с плавающей запятой расширенной точности (действительная и мнимая компоненты).

Поскольку многие из этих типов зависят от платформы, предоставляется набор псевдонимов фиксированной длины:

Тип NumPy

Тип C

Описание

np.int8

int8_t

Байт (-128 до 127)

np.int16

int16_t

Целое число (-32768 до 32767)

np.int32

int32_t

Целое число (-2147483648 до 2147483647)

np.int64

int64_t

Целое число (-9223372036854775808 до 9223372036854775807)

np.uint8

uint8_t

Беззнаковое целое число (0 до 255)

np.uint16

uint16_t

Беззнаковое целое число (0 до 65535)

np.uint32

uint32_t

Беззнаковое целое число (0 до 4294967295)

np.uint64

uint64_t

Беззнаковое целое число (0 до 18446744073709551615)

np.intp

intptr_t

Целое число, используемое для индексирования, обычно такое же, как ssize_t

np.uintp

uintptr_t

Целое число достаточно большое, чтобы вместить указатель

np.float32

float

np.float64 / np.float_

double

Обратите внимание, что это соответствует точности встроенного python float.

np.complex64

float complex

Комплексное число, представленное двумя 32-битными числами с плавающей запятой (действительная и мнимая компоненты)

np.complex128 / np.complex_

double complex

Обратите внимание, что это соответствует точности встроенного python complex.

Числовые типы NumPy являются экземплярами dtype (тип данных) объектов, каждый из которых имеет уникальные характеристики. После импорта NumPy с помощью

>>> import numpy as np

типы данных доступны как np.bool_, np.float32, и т. д.

Расширенные типы, не перечисленные в таблице выше, рассматриваются в разделе Структурированные массивы.

Существует 5 основных числовых типов, представляющих булевы значения (bool), целые числа (int), беззнаковые целые числа (uint), числа с плавающей запятой (float) и комплексные числа. Те, у которых есть числа в имени, указывают на размер типа в битах (то есть сколько бит необходимо для представления одного значения в памяти). Некоторые типы, такие как int и intp, имеют разный размер в битах в зависимости от платформы (например, 32-битные против 64-битных машин). Это следует учитывать при взаимодействии с кодом низкого уровня (таким как C или Fortran), где обращаются к сырой памяти.

Типы данных могут использоваться как функции для преобразования чисел Python в скаляры массивов (см. раздел «Скаляры массивов» для объяснения), последовательностей чисел Python в массивы этого типа или в качестве аргументов для ключевого слова dtype, которое принимают многие функции или методы NumPy. Некоторые примеры:

>>> import numpy as np
>>> x = np.float32(1.0)
>>> x
1.0
>>> y = np.int_([1,2,4])
>>> y
array([1, 2, 4])
>>> z = np.arange(3, dtype=np.uint8)
>>> z
array([0, 1, 2], dtype=uint8)

Типы массивов также могут обозначаться кодами символов, в основном для сохранения обратной совместимости со старыми пакетами, такими как Numeric. Некоторые документации все еще могут ссылаться на них, например:

>>> np.array([1, 2, 3], dtype='f')
array([ 1.,  2.,  3.], dtype=float32)

Рекомендуется использовать объекты dtype вместо этого.

Чтобы преобразовать тип массива, используйте метод .astype() (предпочтительно) или сам тип в качестве функции. Например:

>>> z.astype(float)                 
array([  0.,  1.,  2.])
>>> np.int8(z)
array([0, 1, 2], dtype=int8)

Обратите внимание, что выше мы используем Python-объект с плавающей запятой как dtype. NumPy знает, что int относится к np.int_, bool означает np.bool_, что float является np.float_, а complex является np.complex_ . У других типов данных нет эквивалентов в Python.

Чтобы определить тип массива, обратитесь к атрибуту dtype:

>>> z.dtype
dtype('uint8')

Объекты dtype также содержат информацию о типе, такую как его разрядность и порядок байтов. Тип данных также можно использовать косвенно для запроса свойств типа, например, является ли он целым числом:

>>> d = np.dtype(int)
>>> d
dtype('int32')

>>> np.issubdtype(d, np.integer)
True

>>> np.issubdtype(d, np.floating)
False

Скаляры массивов

NumPy обычно возвращает элементы массивов как скаляры массивов (скаляр со связанным типом данных). Скаляры массивов отличаются от скаляров Python, но в большинстве случаев их можно использовать взаимозаменяемо (главное исключение — версии Python, предшествующие v2.x, где скаляры массивов целых чисел не могут использоваться в качестве индексов для списков и кортежей). Существуют некоторые исключения, например, когда код требует очень специфических атрибутов скаляра или когда он проверяет, является ли значение скаляром Python. Как правило, проблемы легко решаются путем явного преобразования скаляров массивов в скаляры Python, используя соответствующие функции типа Python (например, int, float, complex, str, unicode).

Основное преимущество использования скаляров массивов заключается в том, что они сохраняют тип массива (Python может не иметь соответствующего скалярного типа, например, int16). Следовательно, использование скаляров массивов обеспечивает одинаковое поведение между массивами и скалярами, независимо от того, находится ли значение внутри массива или нет. Скаляры NumPy также имеют многие из тех же методов, что и массивы.

Ошибки переполнения

Фиксированный размер числовых типов NumPy может привести к ошибкам переполнения, когда значение требует больше памяти, чем доступно в типе данных. Например, numpy.power вычисляет 100 * 10 ** 8 правильно для 64-битных целых чисел, но дает 1874919424 (неправильно) для 32-битного целого числа.

>>> np.power(100, 8, dtype=np.int64)
10000000000000000
>>> np.power(100, 8, dtype=np.int32)
1874919424

Поведение типов целых чисел NumPy и Python значительно отличается при переполнении и может сбить с толку пользователей, ожидающих, что целые числа NumPy будут вести себя аналогично целым числам Python int. В отличие от NumPy, размер целых чисел Python int гибкий. Это означает, что целые числа Python могут расширяться для размещения любого целого числа и не будут переполняться.

NumPy предоставляет numpy.iinfo и numpy.finfo для проверки минимальных или максимальных значений NumPy целых и чисел с плавающей запятой соответственно

>>> np.iinfo(int) # Bounds of the default integer on this system.
iinfo(min=-9223372036854775808, max=9223372036854775807, dtype=int64)
>>> np.iinfo(np.int32) # Bounds of a 32-bit integer
iinfo(min=-2147483648, max=2147483647, dtype=int32)
>>> np.iinfo(np.int64) # Bounds of a 64-bit integer
iinfo(min=-9223372036854775808, max=9223372036854775807, dtype=int64)

Если 64-битных целых чисел все еще недостаточно, результат может быть преобразован в число с плавающей запятой. Числа с плавающей запятой предлагают больший, но неточный диапазон возможных значений.

>>> np.power(100, 100, dtype=np.int64) # Incorrect even with 64-bit int
0
>>> np.power(100, 100, dtype=np.float64)
1e+200

Расширенная точность

Числа с плавающей точкой Python обычно представляют собой 64-битные числа с плавающей точкой, почти эквивалентные np.float64. В некоторых необычных ситуациях может быть полезно использовать числа с плавающей точкой с большей точностью. Возможно ли это в numpy зависит от аппаратного обеспечения и среды разработки: в частности, машины x86 обеспечивают аппаратную плавающую точку с точностью 80 бит, и хотя большинство компиляторов C предоставляют это как свой тип long double, MSVC (стандартный для Windows сборок) делает long double идентичным double (64 бита). NumPy предоставляет возможность использования long double компилятора как np.longdouble (и np.clongdouble для комплексных чисел). Вы можете узнать, что предоставляет ваш numpy с помощью np.finfo(np.longdouble).

NumPy не предоставляет тип данных с большей точностью, чем тип C long double; в частности, 128-битный тип данных IEEE с четырёхкратной точностью (тип FORTRAN REAL*16) недоступен.

Для эффективного выравнивания памяти np.longdouble обычно хранится, дополненное нулевыми битами, либо до 96, либо до 128 бит. Какой вариант более эффективен, зависит от аппаратного обеспечения и среды разработки; как правило, на 32-битных системах они дополняются до 96 бит, а на 64-битных системах — обычно до 128 бит. np.longdouble дополняется до системного значения по умолчанию; np.float96 и np.float128 предоставляются пользователям, которые хотят задать конкретное дополнение. Несмотря на названия, np.float96 и np.float128 обеспечивают только такую же точность, как np.longdouble, то есть 80 бит на большинстве машин x86 и 64 бит в стандартных сборках Windows.

Следует помнить, что даже если np.longdouble предлагает большую точность, чем python float, легко потерять эту дополнительную точность, так как Python часто заставляет значения проходить через float. Например, оператор форматирования % требует, чтобы его аргументы были преобразованы к стандартным типам Python, и поэтому невозможно сохранить расширенную точность, даже если запрошено много десятичных знаков. Полезно протестировать ваш код с помощью значения 1 + np.finfo(np.longdouble).eps.

© 2005–2020 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/1.18/user/basics.types.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API