Скаляры#

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

В NumPy есть 24 новых фундаментальных типа Python для описания различных типов скаляров. Эти дескрипторы типов в основном основаны на типах, доступных в языке C, на котором написан CPython, с несколькими дополнительными типами, совместимыми с типами Python.

Скаляры массивов имеют те же атрибуты и методы, что и ndarrays. [1] Это позволяет обрабатывать элементы массива частично на том же уровне, что и массивы, сглаживая неровности, возникающие при смешивании скалярных и массивных операций.

Скаляры массивов находятся в иерархии (см. рисунок ниже) типов данных. Их можно обнаружить с помощью иерархии: Например, isinstance(val, np.generic) вернет True if val является объектом скаляра массива. Альтернативно, какой тип скаляра массива присутствует, можно определить с помощью других членов иерархии типов данных. Таким образом, например isinstance(val, np.complexfloating) вернет True if val является комплексным типом, в то время как isinstance(val, np.flexible) вернёт true, если val является одним из типов массивов с гибким размером элемента (str_, bytes_, void).

../_images/dtype-hierarchy.png

Рисунок: Иерархия объектов типа, представляющих типы данных массива. Не показаны два целочисленных типа intp и uintp которые используются для индексации (так же, как целочисленный по умолчанию, начиная с NumPy 2).#

Встроенные скалярные типы#

Встроенные скалярные типы показаны ниже. Имена в стиле C связаны с символьными кодами, которые показаны в их описаниях. Однако использование символьных кодов не рекомендуется.

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

Тип скаляра массива

Связанный тип Python

Наследует?

int_

int

нет

double

float

да

cdouble

complex

да

bytes_

bytes

да

str_

str

да

bool_

bool

нет

datetime64

datetime.datetime

нет

timedelta64

datetime.timedelta

нет

The bool_ тип данных очень похож на Python bool но не наследует от него, потому что Python bool не позволяет наследоваться от себя, и на уровне C размер фактических данных bool не совпадает с размером скаляра Boolean в Python.

Предупреждение

The int_ тип делает не наследовать от встроенного int, потому что тип int не является целочисленным типом фиксированной ширины.

Совет

Тип данных по умолчанию в NumPy — double.

класс numpy.общий[источник]#

Базовый класс для скалярных типов numpy.

Класс, от которого происходят большинство (все?) скалярные типы numpy. Для единообразия предоставляет тот же API, что и ndarray, несмотря на то, что многие последующие атрибуты либо «только для чтения», либо полностью нерелевантны. Это класс, от которого настоятельно рекомендуется наследовать пользовательские скалярные типы.

класс numpy.число[источник]#

Абстрактный базовый класс всех числовых скалярных типов.

Целочисленные типы#

класс numpy.целое число[источник]#

Абстрактный базовый класс всех целочисленных скалярных типов.

Примечание

Целочисленные типы numpy отражают поведение целых чисел C и поэтому могут подвергаться Ошибки переполнения.

Знаковые целочисленные типы#

класс numpy.signedinteger[источник]#

Абстрактный базовый класс всех скалярных типов со знаком.

класс numpy.байт[источник]#

int8(value=0, /) –

Целочисленный тип со знаком, совместимый с C char.

Символьный код:

'b'

Каноническое имя:

numpy.byte

Псевдоним на этой платформе (Linux x86_64):

numpy.int8: 8-битное целое число со знаком (-128 to 127).

класс numpy.короткий[источник]#

int16(value=0, /) –

Целочисленный тип со знаком, совместимый с C short.

Символьный код:

'h'

Каноническое имя:

numpy.short

Псевдоним на этой платформе (Linux x86_64):

numpy.int16: 16-битное целое число со знаком (-32_768 to 32_767).

класс numpy.intc[источник]#

int32(value=0, /) –

Целочисленный тип со знаком, совместимый с C int.

Символьный код:

'i'

Каноническое имя:

numpy.intc

Псевдоним на этой платформе (Linux x86_64):

numpy.int32: 32-битное знаковое целое число (-2_147_483_648 to 2_147_483_647).

класс numpy.int_[источник]#

int64(value=0, /) –

Целочисленный тип со знаком, совместимый с C long.

Символьный код:

'l'

Каноническое имя:

numpy.long

Псевдоним на этой платформе (Linux x86_64):

numpy.int64: 64-битное знаковое целое число (-9_223_372_036_854_775_808 to 9_223_372_036_854_775_807).

Псевдоним на этой платформе (Linux x86_64):

numpy.intp: Знаковое целое число, достаточно большое для хранения указателя, совместимое с C intptr_t.

numpy.long[источник]#

псевдоним int_

класс numpy.longlong(значение=0, /)[источник]#

Целочисленный тип со знаком, совместимый с C long long.

Символьный код:

'q'

Беззнаковые целочисленные типы#

класс numpy.unsignedinteger[источник]#

Абстрактный базовый класс всех беззнаковых целочисленных скалярных типов.

класс numpy.ubyte[источник]#

uint8(value=0, /) –

Беззнаковый целочисленный тип, совместимый с C unsigned char.

Символьный код:

'B'

Каноническое имя:

numpy.ubyte

Псевдоним на этой платформе (Linux x86_64):

numpy.uint8: 8-битное целое число без знака (0 to 255).

класс numpy.ushort[источник]#

uint16(value=0, /) –

Беззнаковый целочисленный тип, совместимый с C unsigned short.

Символьный код:

'H'

Каноническое имя:

numpy.ushort

Псевдоним на этой платформе (Linux x86_64):

numpy.uint16: 16-битное целое без знака (0 to 65_535).

класс numpy.uintc[источник]#

uint32(value=0, /) –

Беззнаковый целочисленный тип, совместимый с C unsigned int.

Символьный код:

'I'

Каноническое имя:

numpy.uintc

Псевдоним на этой платформе (Linux x86_64):

numpy.uint32: 32-битное целое число без знака (0 to 4_294_967_295).

класс numpy.uint[источник]#

uint64(value=0, /) –

Беззнаковый знаковый целочисленный тип, 64-битный на 64-битных системах и 32-битный на 32-битных системах.

Символьный код:

'L'

Каноническое имя:

numpy.uint

Псевдоним на этой платформе (Linux x86_64):

numpy.uint64: 64-битное беззнаковое целое (0 to 18_446_744_073_709_551_615).

Псевдоним на этой платформе (Linux x86_64):

numpy.uintp: Беззнаковое целое, достаточно большое для хранения указателя, совместимое с C uintptr_t.

numpy.ulong[источник]#

псевдоним uint

класс numpy.ulonglong(значение=0, /)[источник]#

Беззнаковый целочисленный тип, совместимый с C unsigned long long.

Символьный код:

'Q'

Неточные типы#

класс numpy.неточный[источник]#

Абстрактный базовый класс всех числовых скалярных типов с (потенциально) неточным представлением значений в его диапазоне, таких как числа с плавающей запятой.

Примечание

Неточные скаляры выводятся с использованием минимального количества десятичных цифр, необходимых для отличия их значения от других значений того же типа данных, путём разумного округления. См. unique параметр format_float_positional и format_float_scientific.

Это означает, что переменные с одинаковыми двоичными значениями, но типами данных разной точности могут отображаться по-разному:

>>> import numpy as np
>>> f16 = np.float16("0.1")
>>> f32 = np.float32(f16)
>>> f64 = np.float64(f32)
>>> f16 == f32 == f64
True
>>> f16, f32, f64
(0.1, 0.099975586, 0.0999755859375)

Обратите внимание, что ни одно из этих чисел с плавающей запятой не содержит точное значение \(\frac{1}{10}\); f16 печатается как 0.1 потому что это максимально близкое значение к этому значению, тогда как другие типы не имеют, так как у них больше точности и поэтому есть более близкие значения.

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

>>> f16 = np.float16("0.1")
>>> f32 = np.float32("0.1")
>>> f64 = np.float64("0.1")
>>> f16 == f32 == f64
False
>>> f16, f32, f64
(0.1, 0.1, 0.1)

Типы с плавающей запятой#

класс numpy.с плавающей точкой[источник]#

Абстрактный базовый класс всех скалярных типов с плавающей точкой.

класс numpy.half[источник]#

float16(value=0, /) –

Тип числа с плавающей запятой половинной точности.

Символьный код:

'e'

Каноническое имя:

numpy.half

Псевдоним на этой платформе (Linux x86_64):

numpy.float16: 16-битный тип числа с плавающей запятой: бит знака, 5 бит экспоненты, 10 бит мантиссы.

класс numpy.одиночный[источник]#

float32(value=0, /) –

Тип числа с плавающей запятой одинарной точности, совместимый с C float.

Символьный код:

'f'

Каноническое имя:

numpy.single

Псевдоним на этой платформе (Linux x86_64):

numpy.float32: 32-битный тип числа с плавающей точкой: знаковый бит, 8 бит экспоненты, 23 бита мантиссы.

класс numpy.double(x=0, /)[источник]#

float64(value=0, /) –

Тип числа с плавающей запятой двойной точности, совместимый с Python float и C double.

Символьный код:

'd'

Каноническое имя:

numpy.double

Псевдоним на этой платформе (Linux x86_64):

numpy.float64: 64-битный тип числа с плавающей точкой: знаковый бит, 11 бит экспоненты, 52 бита мантиссы.

класс numpy.longdouble(значение=0, /)[источник]#

Тип числа с плавающей запятой расширенной точности, совместимый с C long double но не обязательно с IEEE 754 четверной точностью.

Символьный код:

'g'

Псевдоним на этой платформе (Linux x86_64):

numpy.float128: 128-битный тип числа с расширенной точностью с плавающей запятой.

Комплексные типы с плавающей запятой#

класс numpy.complexfloating[источник]#

Абстрактный базовый класс всех скалярных типов комплексных чисел, которые состоят из чисел с плавающей запятой.

класс numpy.csingle[источник]#

complex64(real=0, imag=0, /) –

Тип комплексного числа, состоящий из двух чисел с плавающей запятой одинарной точности.

Символьный код:

'F'

Каноническое имя:

numpy.csingle

Псевдоним на этой платформе (Linux x86_64):

numpy.complex64: Тип комплексного числа, состоящий из 2 чисел с плавающей запятой с 32-битной точностью.

класс numpy.cdouble(вещественный=0, imag=0)[источник]#

complex128(real=0, imag=0, /) –

Тип комплексного числа, состоящий из двух чисел с плавающей запятой двойной точности, совместимый с Python complex.

Символьный код:

'D'

Каноническое имя:

numpy.cdouble

Псевдоним на этой платформе (Linux x86_64):

numpy.complex128: Тип комплексного числа, состоящий из 2 чисел с плавающей запятой двойной точности (64-бит).

класс numpy.clongdouble(вещественный=0, imag=0, /)[источник]#

Тип комплексного числа, состоящий из двух чисел с расширенной точностью с плавающей запятой.

Символьный код:

'G'

Псевдоним на этой платформе (Linux x86_64):

numpy.complex256: Тип комплексного числа, состоящий из 2 чисел с плавающей запятой расширенной точности размером 128 бит.

Другие типы#

numpy.bool_[источник]#

псевдоним bool

класс numpy.bool(значение=False, /)[источник]#

Логический тип (True или False), хранится как байт.

Предупреждение

The bool тип не является подклассом int_ тип (тот bool не является даже числовым типом). Это отличается от реализации по умолчанию в Python bool как подкласс int.

Символьный код:

'?'

класс numpy.datetime64(значение=None, *args)[источник]#

Если создан из 64-битного целого числа, он представляет смещение от 1970-01-01T00:00:00. Если создано из строки, строка может быть в формате даты или даты-времени ISO 8601.

При разборе строки для создания объекта datetime, если строка содержит конечный часовой пояс ('Z' или смещение часового пояса), часовой пояс будет удалён и выдано предупреждение пользователя.

Объекты Datetime64 следует считать находящимися в UTC и, следовательно, имеющими смещение +0000.

>>> np.datetime64(10, 'Y')
np.datetime64('1980')
>>> np.datetime64('1980', 'Y')
np.datetime64('1980')
>>> np.datetime64(10, 'D')
np.datetime64('1970-01-11')

См. Даты и временные интервалы для получения дополнительной информации.

Символьный код:

'M'

класс numpy.timedelta64(значение=0, *args)[источник]#

Временной интервал, хранящийся как 64-битное целое число.

См. Даты и временные интервалы для получения дополнительной информации.

Символьный код:

'm'

класс numpy.object_(значение=None, /)[источник]#

Любой объект Python.

Символьный код:

'O'

Примечание

Фактические данные, хранящиеся в массивах объектов (т.е., массивы, имеющие dtype object_) являются ссылками на объекты Python, а не самими объектами. Следовательно, массивы объектов ведут себя больше как обычные Python lists, в том смысле, что их содержимое не обязательно должно быть одного типа Python.

Тип object также особенный, потому что массив, содержащий object_ items не возвращает object_ объект при доступе к элементу, а вместо этого возвращает фактический объект, на который ссылается элемент массива.

Следующие типы данных гибкий: они не имеют предопределенного размера, и данные, которые они описывают, могут иметь разную длину в разных массивах. (В кодах символов # является целым числом, обозначающим, из скольких элементов состоит тип данных.)

класс numpy.гибкий[источник]#

Абстрактный базовый класс всех скалярных типов без предопределенной длины. Фактический размер этих типов зависит от конкретного numpy.dtype создание экземпляра.

класс numpy.символ[источник]#

Абстрактный базовый класс всех скалярных типов символьных строк.

класс numpy.bytes_(значение='', *args, **kwargs)[источник]#

Байтовая строка.

При использовании в массивах этот тип удаляет завершающие нулевые байты.

Символьный код:

'S'

класс numpy.str_(значение='', *args, **kwargs)[источник]#

Строка в кодировке Unicode.

Этот тип удаляет завершающие нулевые кодовые точки.

>>> s = np.str_("abc\x00")
>>> s
'abc'

В отличие от встроенных str, это поддерживает Протокол буфера, раскрывая его содержимое как UCS4:

>>> m = memoryview(np.str_("abc"))
>>> m.format
'3w'
>>> m.tobytes()
b'a\x00\x00\x00b\x00\x00\x00c\x00\x00\x00'
Символьный код:

'U'

класс numpy.void(length_or_data, /, dtype=None)[источник]#

Создать новый структурированный или неструктурированный void скаляр.

Параметры:
length_or_dataint, array-like, bytes-like, object

Одно из нескольких значений (см. примечания). Длина или байтовые данные неструктурированного void. Или, альтернативно, данные для хранения в новом скаляре, когда dtype предоставлен. Это может быть array-like, в этом случае может быть возвращен массив.

dtypedtype, опционально

Если указан dtype нового скаляра. Этот dtype должен быть dtype "void" (т.е. структурированным или неструктурированным void, см. также Структурированные типы данных).

Новое в версии 1.24.

Примечания

По историческим причинам и потому что void скаляры могут представлять как произвольные байтовые данные, так и структурированные dtypes, конструктор void имеет три соглашения о вызове:

  1. np.void(5) создает dtype="V5" скаляр, заполненный пятью

    \0 байт. 5 может быть целым числом Python или NumPy.

  2. np.void(b"bytes-like") создает скаляр void из строки байтов.

    Размер элемента dtype будет соответствовать длине байтовой строки, здесь "V10".

  3. Когда dtype= передаётся, вызов примерно такой же, как

    создание массива. Однако возвращается скаляр void, а не массив.

Пожалуйста, ознакомьтесь с примерами, которые демонстрируют все три различных соглашения.

Примеры

>>> np.void(5)
np.void(b'\x00\x00\x00\x00\x00')
>>> np.void(b'abcd')
np.void(b'\x61\x62\x63\x64')
>>> np.void((3.2, b'eggs'), dtype="d,S5")
np.void((3.2, b'eggs'), dtype=[('f0', '
>>> np.void(3, dtype=[('x', np.int8), ('y', np.int8)])
np.void((3, 3), dtype=[('x', 'i1'), ('y', 'i1')])
Символьный код:

'V'

Предупреждение

См. Примечание о строковых типах.

Совместимость с Numeric: Если вы использовали старые символы типов в коде Numeric (что никогда не рекомендовалось), вам нужно изменить некоторые из них на новые символы. В частности, необходимые изменения: c -> S1, b -> B, 1 -> b, s -> h, w -> H, и u -> I. Эти изменения делают соглашение о символах типов более согласованным с другими модулями Python, такими как struct модуль.

Псевдонимы с размером#

Наряду с их (в основном) C-производными именами, целочисленные, вещественные и комплексные типы данных также доступны с использованием соглашения о битовой ширине, чтобы всегда можно было обеспечить массив правильного размера. Два псевдонима (numpy.intp и numpy.uintp) указывающий на целочисленный тип, достаточно большой для хранения C-указателя, также предоставляются.

numpy.int8[источник]#
numpy.int16#
numpy.int32#
numpy.int64#

Псевдонимы для знаковых целочисленных типов (один из numpy.byte, numpy.short, numpy.intc, numpy.int_, numpy.long и numpy.longlong) с указанным количеством битов.

Совместимо с C99 int8_t, int16_t, int32_t, и int64_t, соответственно.

numpy.uint8[источник]#
numpy.uint16#
numpy.uint32#
numpy.uint64#

Псевдоним для беззнаковых целочисленных типов (один из numpy.ubyte, numpy.ushort, numpy.uintc, numpy.uint, numpy.ulong и numpy.ulonglong) с указанным количеством битов.

Совместимо с C99 uint8_t, uint16_t, uint32_t, и uint64_t, соответственно.

numpy.intp[источник]#

Псевдоним для знакового целочисленного типа (один из numpy.byte, numpy.short, numpy.intc, numpy.int_, numpy.long и numpy.longlong) который используется как целое число по умолчанию и для индексации.

Совместимо с C Py_ssize_t.

Символьный код:

'n'

Изменено в версии 2.0: До NumPy 2 это имело тот же размер, что и указатель. На практике это почти всегда идентично, но символьный код 'p' соответствует C intptr_t. Символьный код 'n' был добавлен в NumPy 2.0.

numpy.uintp[источник]#

Псевдоним для беззнакового целочисленного типа того же размера, что и intp.

Совместимо с C size_t.

Символьный код:

'N'

Изменено в версии 2.0: До NumPy 2 это имело тот же размер, что и указатель. На практике это почти всегда идентично, но символьный код 'P' соответствует C uintptr_t. Символьный код 'N' был добавлен в NumPy 2.0.

numpy.float16[источник]#

псевдоним half

numpy.float32[источник]#

псевдоним single

numpy.float64[источник]#

псевдоним double

numpy.float96#
numpy.float128[источник]#

Псевдоним для numpy.longdouble, названные по их размеру в битах. Существование этих псевдонимов зависит от платформы.

numpy.complex64[источник]#

псевдоним csingle

numpy.complex128[источник]#

псевдоним cdouble

numpy.complex192#
numpy.complex256[источник]#

Псевдоним для numpy.clongdouble, названные по их размеру в битах. Существование этих псевдонимов зависит от платформы.

Атрибуты#

Объекты скаляров массива имеют array priority of NPY_SCALAR_PRIORITY (-1,000,000.0). Они также (пока) не имеют ctypes атрибут. В противном случае они имеют те же атрибуты, что и массивы:

generic.flags

Целочисленное значение флагов.

generic.shape

Кортеж размерностей массива.

generic.strides

Кортеж шагов в байтах в каждом измерении.

generic.ndim

Количество измерений массива.

generic.data

Указатель на начало данных.

generic.size

Количество элементов в gentype.

generic.itemsize

Длина одного элемента в байтах.

generic.base

Скалярный атрибут, идентичный ndarray.base.

generic.dtype

Получить дескриптор данных массива.

generic.real

Действительная часть скаляра.

generic.imag

Мнимая часть скаляра.

generic.flat

1-D представление скаляра.

generic.T

Скалярный атрибут, идентичный ndarray.T.

generic.__array_interface__

Протокол массива: сторона Python

generic.__array_struct__

Протокол массива: struct

generic.__array_priority__

Приоритет массива.

generic.__array_wrap__

Реализация __array_wrap__ для скалярных типов

Индексирование#

Скаляры массива могут индексироваться как 0-мерные массивы: если x является скаляром массива,

  • x[()] возвращает копию скаляра массива

  • x[...] возвращает 0-мерный ndarray

  • x['field-name'] возвращает скаляр массива в поле field-name. (x может иметь поля, например, когда соответствует структурированному типу данных.)

Методы#

Скаляры массивов имеют точно такие же методы, как и массивы. Поведение этих методов по умолчанию - внутреннее преобразование скаляра в эквивалентный 0-мерный массив и вызов соответствующего метода массива. Кроме того, математические операции над скалярами массивов определены так, что устанавливаются те же аппаратные флаги и используются для интерпретации результатов, как и для универсальная функция (ufunc), так что состояние ошибки, используемое для ufuncs, также распространяется на математические операции со скалярами массивов.

Исключения из приведённых выше правил даны ниже:

generic.__array__

sc.__array__(dtype) возвращает 0-мерный массив из скаляра с указанным dtype

generic.__array_wrap__

Реализация __array_wrap__ для скалярных типов

generic.squeeze(/[, axis])

Скалярный метод, идентичный ndarray.squeeze.

generic.byteswap(/[, inplace])

Скалярный метод, идентичный ndarray.byteswap.

generic.__reduce__

Вспомогательная функция для pickle.

generic.__setstate__

generic.setflags(*[, write, align, uic])

Скалярный метод, идентичный ndarray.setflags.

Вспомогательный метод для типизации:

number.__class_getitem__(item, /)

Возвращает параметризованную обертку вокруг number тип.

Определение новых типов#

Существует два способа эффективного определения нового скалярного типа массива (помимо составления структурированных типов dtypes из встроенных скалярных типов): Один из способов — просто создать подкласс ndarray и переопределить интересующие методы. Это будет работать до определённой степени, но внутренне некоторые поведения фиксированы типом данных массива. Чтобы полностью настроить тип данных массива, необходимо определить новый тип данных и зарегистрировать его в NumPy. Такие новые типы могут быть определены только на C, используя NumPy C-API.