Скаляры#
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).
Рисунок: Иерархия объектов типа, представляющих типы данных массива. Не показаны два целочисленных типа intp и
uintp которые используются для индексации (так же, как целочисленный по умолчанию, начиная с NumPy 2).#
Встроенные скалярные типы#
Встроенные скалярные типы показаны ниже. Имена в стиле C связаны с символьными кодами, которые показаны в их описаниях. Однако использование символьных кодов не рекомендуется.
Некоторые скалярные типы по сути эквивалентны фундаментальным типам Python и поэтому наследуются от них, а также от общего типа скаляра массива:
Тип скаляра массива |
Связанный тип Python |
Наследует? |
|---|---|---|
нет |
||
да |
||
да |
||
да |
||
да |
||
нет |
||
нет |
||
нет |
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'- Каноническое имя:
- Псевдоним на этой платформе (Linux x86_64):
numpy.int8: 8-битное целое число со знаком (-128to127).
- класс numpy.короткий[источник]#
int16(value=0, /) –
Целочисленный тип со знаком, совместимый с C
short.- Символьный код:
'h'- Каноническое имя:
- Псевдоним на этой платформе (Linux x86_64):
numpy.int16: 16-битное целое число со знаком (-32_768to32_767).
- класс numpy.intc[источник]#
int32(value=0, /) –
Целочисленный тип со знаком, совместимый с C
int.- Символьный код:
'i'- Каноническое имя:
- Псевдоним на этой платформе (Linux x86_64):
numpy.int32: 32-битное знаковое целое число (-2_147_483_648to2_147_483_647).
- класс numpy.int_[источник]#
int64(value=0, /) –
Целочисленный тип со знаком, совместимый с C
long.- Символьный код:
'l'- Каноническое имя:
- Псевдоним на этой платформе (Linux x86_64):
numpy.int64: 64-битное знаковое целое число (-9_223_372_036_854_775_808to9_223_372_036_854_775_807).- Псевдоним на этой платформе (Linux x86_64):
numpy.intp: Знаковое целое число, достаточно большое для хранения указателя, совместимое с Cintptr_t.
- numpy.long[источник]#
псевдоним
int_
- класс numpy.longlong(значение=0, /)[источник]#
Целочисленный тип со знаком, совместимый с C
long long.- Символьный код:
'q'
Беззнаковые целочисленные типы#
- класс numpy.unsignedinteger[источник]#
Абстрактный базовый класс всех беззнаковых целочисленных скалярных типов.
- класс numpy.ubyte[источник]#
uint8(value=0, /) –
Беззнаковый целочисленный тип, совместимый с C
unsigned char.- Символьный код:
'B'- Каноническое имя:
- Псевдоним на этой платформе (Linux x86_64):
numpy.uint8: 8-битное целое число без знака (0to255).
- класс numpy.ushort[источник]#
uint16(value=0, /) –
Беззнаковый целочисленный тип, совместимый с C
unsigned short.- Символьный код:
'H'- Каноническое имя:
- Псевдоним на этой платформе (Linux x86_64):
numpy.uint16: 16-битное целое без знака (0to65_535).
- класс numpy.uintc[источник]#
uint32(value=0, /) –
Беззнаковый целочисленный тип, совместимый с C
unsigned int.- Символьный код:
'I'- Каноническое имя:
- Псевдоним на этой платформе (Linux x86_64):
numpy.uint32: 32-битное целое число без знака (0to4_294_967_295).
- класс numpy.uint[источник]#
uint64(value=0, /) –
Беззнаковый знаковый целочисленный тип, 64-битный на 64-битных системах и 32-битный на 32-битных системах.
- Символьный код:
'L'- Каноническое имя:
- Псевдоним на этой платформе (Linux x86_64):
numpy.uint64: 64-битное беззнаковое целое (0to18_446_744_073_709_551_615).- Псевдоним на этой платформе (Linux x86_64):
numpy.uintp: Беззнаковое целое, достаточно большое для хранения указателя, совместимое с Cuintptr_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'- Каноническое имя:
- Псевдоним на этой платформе (Linux x86_64):
numpy.float16: 16-битный тип числа с плавающей запятой: бит знака, 5 бит экспоненты, 10 бит мантиссы.
- класс numpy.одиночный[источник]#
float32(value=0, /) –
Тип числа с плавающей запятой одинарной точности, совместимый с C
float.- Символьный код:
'f'- Каноническое имя:
- Псевдоним на этой платформе (Linux x86_64):
numpy.float32: 32-битный тип числа с плавающей точкой: знаковый бит, 8 бит экспоненты, 23 бита мантиссы.
- класс numpy.double(x=0, /)[источник]#
float64(value=0, /) –
Тип числа с плавающей запятой двойной точности, совместимый с Python
floatи Cdouble.- Символьный код:
'd'- Каноническое имя:
- Псевдоним на этой платформе (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'- Каноническое имя:
- Псевдоним на этой платформе (Linux x86_64):
numpy.complex64: Тип комплексного числа, состоящий из 2 чисел с плавающей запятой с 32-битной точностью.
- класс numpy.cdouble(вещественный=0, imag=0)[источник]#
complex128(real=0, imag=0, /) –
Тип комплексного числа, состоящий из двух чисел с плавающей запятой двойной точности, совместимый с Python
complex.- Символьный код:
'D'- Каноническое имя:
- Псевдоним на этой платформе (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не является даже числовым типом). Это отличается от реализации по умолчанию в Pythonboolкак подкласс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 имеет три соглашения о вызове:
np.void(5)создаетdtype="V5"скаляр, заполненный пятью\0байт. 5 может быть целым числом Python или NumPy.
np.void(b"bytes-like")создает скаляр void из строки байтов.Размер элемента dtype будет соответствовать длине байтовой строки, здесь
"V10".
- Когда
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'соответствует Cintptr_t. Символьный код'n'был добавлен в NumPy 2.0.
- numpy.uintp[источник]#
Псевдоним для беззнакового целочисленного типа того же размера, что и
intp.Совместимо с C
size_t.- Символьный код:
'N'
Изменено в версии 2.0: До NumPy 2 это имело тот же размер, что и указатель. На практике это почти всегда идентично, но символьный код
'P'соответствует Cuintptr_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
атрибут. В противном случае они имеют те же атрибуты, что и массивы:
Целочисленное значение флагов. |
|
Кортеж размерностей массива. |
|
Кортеж шагов в байтах в каждом измерении. |
|
Количество измерений массива. |
|
Указатель на начало данных. |
|
Количество элементов в gentype. |
|
Длина одного элемента в байтах. |
|
Скалярный атрибут, идентичный |
|
Получить дескриптор данных массива. |
|
Действительная часть скаляра. |
|
Мнимая часть скаляра. |
|
1-D представление скаляра. |
|
Скалярный атрибут, идентичный |
|
Протокол массива: сторона Python |
|
Протокол массива: struct |
|
Приоритет массива. |
|
Реализация __array_wrap__ для скалярных типов |
Индексирование#
Смотрите также
Скаляры массива могут индексироваться как 0-мерные массивы: если x является скаляром массива,
x[()]возвращает копию скаляра массиваx[...]возвращает 0-мерныйndarrayx['field-name']возвращает скаляр массива в поле field-name. (x может иметь поля, например, когда соответствует структурированному типу данных.)
Методы#
Скаляры массивов имеют точно такие же методы, как и массивы. Поведение этих методов по умолчанию - внутреннее преобразование скаляра в эквивалентный 0-мерный массив и вызов соответствующего метода массива. Кроме того, математические операции над скалярами массивов определены так, что устанавливаются те же аппаратные флаги и используются для интерпретации результатов, как и для универсальная функция (ufunc), так что состояние ошибки, используемое для ufuncs, также распространяется на математические операции со скалярами массивов.
Исключения из приведённых выше правил даны ниже:
sc.__array__(dtype) возвращает 0-мерный массив из скаляра с указанным dtype |
|
Реализация __array_wrap__ для скалярных типов |
|
|
Скалярный метод, идентичный |
|
Скалярный метод, идентичный |
Вспомогательная функция для pickle. |
|
|
Скалярный метод, идентичный |
Вспомогательный метод для типизации:
|
Возвращает параметризованную обертку вокруг |
Определение новых типов#
Существует два способа эффективного определения нового скалярного типа массива
(помимо составления структурированных типов dtypes из встроенных скалярных типов): Один из способов — просто создать подкласс
ndarray и переопределить интересующие методы. Это будет работать до
определённой степени, но внутренне некоторые поведения фиксированы типом данных
массива. Чтобы полностью настроить тип данных массива, необходимо
определить новый тип данных и зарегистрировать его в NumPy. Такие новые типы могут быть определены
только на C, используя NumPy C-API.