Скаляры
Python определяет только один тип данных конкресного класса (существует только один целочисленный тип, один тип с плавающей точкой и т. д.). Это может быть удобно в приложениях, которым не нужно учитывать все способы представления данных в компьютере. Однако для научных вычислений часто требуется больший контроль.
В NumPy существует 24 новых фундаментальных типа Python для описания различных типов скаляров. Эти описатели типов в основном основаны на типах, доступных в языке C, на котором написан CPython, с несколькими дополнительными типами, совместимыми с типами Python.
Скаляры массивов имеют те же атрибуты и методы, что и ndarrays. 1 Это позволяет обращаться к элементам массива частично так же, как к массивам, сглаживая неровности, возникающие при смешивании скалярных и массивов операций.
Скаляры массивов находятся в иерархии (см. рисунок ниже) типов данных. Их можно обнаружить, используя иерархию: например, isinstance(val, np.generic) вернёт True, если val является объектом скаляра массива. В качестве альтернативы, можно определить какой скаляр массива присутствует, используя другие члены иерархии типов данных. Таким образом, например, isinstance(val, np.complexfloating) вернёт True, если val представляет комплексный тип, в то время как isinstance(val, np.flexible) вернёт true, если val является одним из гибких типов массивов с размером элементов (str_, bytes_, void).
Рисунок: Иерархия объектов типов, представляющих типы данных массивов. Не показаны два целочисленных типа intp и uintp, которые просто указывают на целочисленный тип, который содержит указатель для платформы. Все числовые типы также могут быть получены с использованием имен ширины разряда.
- 1
-
Однако скаляры массивов неизменяемы, поэтому ни один из атрибутов скаляра массива не может быть изменён.
Встроенные скалярные типы
Встроенные скалярные типы показаны ниже. Имена в стиле C связаны с кодами символов, которые показаны в их описаниях. Однако использование кодов символов не рекомендуется.
Некоторые скалярные типы по существу эквивалентны фундаментальным типам Python и поэтому наследуют их, а также от обобщённого скалярного типа массива:
Тип скаляра массива | Соответствующий тип Python | Наследует? |
|---|---|---|
Только Python 2 | ||
да | ||
да | ||
да | ||
да | ||
нет | ||
нет | ||
нет |
Тип данных bool_ очень похож на Python bool, но не наследует от него, потому что Python bool не позволяет себя наследовать, а на уровне C размер фактических данных bool не совпадает со скаляром булевого типа Python.
Предупреждение
Тип int_ не наследует от int в Python 3, потому что тип int больше не является целочисленным типом фиксированной ширины.
Подсказка
По умолчанию в NumPy используется тип данных float_.
- class numpy.generic[source]
-
Базовый класс для скалярных типов NumPy.
Класс, от которого происходят большинство (все?) скалярных типов NumPy. Для согласованности он предоставляет тот же API, что и
ndarray, несмотря на то, что многие последующие атрибуты являются либо только для чтения, либо совершенно не имеют отношения к делу. Это класс, от которого, как настоятельно рекомендуется, пользователи должны наследовать пользовательские скалярные типы.
- class numpy.number[source]
-
Абстрактный базовый класс всех числовых скалярных типов.
Целочисленные типы
- class numpy.integer[source]
-
Абстрактный базовый класс всех целочисленных скалярных типов.
Примечание
Целочисленные типы NumPy отражают поведение целочисленных типов C и поэтому могут быть подвержены ошибкам переполнения.
Означенные целочисленные типы
- class numpy.signedinteger[source]
-
Абстрактный базовый класс всех знакомых целочисленных скалярных типов.
- class numpy.byte[source]
-
Целочисленный тип со знаком, совместимый с C
char.- Код символа
-
'b' - Псевдоним на этой платформе (Linux x86_64)
-
numpy.int8: 8-битное знаковое целое число (от-128до127).
- класс numpy.short[source]
-
Целочисленный тип со знаком, совместимый с C
short.- Код символа
-
'h' - Псевдоним на этой платформе (Linux x86_64)
-
numpy.int16: 16-битное целое число со знаком (-32_768до32_767).
- класс numpy.intc[source]
-
Целочисленный тип со знаком, совместимый с C
int.- Код символа
-
'i' - Псевдоним на этой платформе (Linux x86_64)
-
numpy.int32: 32-битное целое число со знаком (-2_147_483_648до2_147_483_647).
- класс numpy.int_[source]
-
Целочисленный тип со знаком, совместимый с Python
intи Clong.- Код символа
-
'l' - Псевдоним на этой платформе (Linux x86_64)
-
numpy.int64: 64-битное целое число со знаком (-9_223_372_036_854_775_808до9_223_372_036_854_775_807). - Псевдоним на этой платформе (Linux x86_64)
-
numpy.intp: Целое число со знаком, достаточно большое, чтобы вместить указатель, совместимое с Cintptr_t.
- класс numpy.longlong[source]
-
Целочисленный тип со знаком, совместимый с C
long long.- Код символа
-
'q'
Целочисленные типы без знака
- класс numpy.unsignedinteger[source]
-
Абстрактный базовый класс всех целочисленных скалярных типов без знака.
- класс numpy.ubyte[source]
-
Целочисленный тип без знака, совместимый с C
unsigned char.- Код символа
-
'B' - Псевдоним на этой платформе (Linux x86_64)
-
numpy.uint8: 8-битное целое число без знака (0до255).
- класс numpy.ushort[source]
-
Целочисленный тип без знака, совместимый с C
unsigned short.- Код символа
-
'H' - Псевдоним на этой платформе (Linux x86_64)
-
numpy.uint16: 16-битное целое число без знака (0до65_535).
- класс numpy.uintc[source]
-
Целочисленный тип без знака, совместимый с C
unsigned int.- Код символа
-
'I' - Псевдоним на этой платформе (Linux x86_64)
-
numpy.uint32: 32-битное целое число без знака (0до4_294_967_295).
- класс numpy.uint[source]
-
Целочисленный тип без знака, совместимый с C
unsigned long.- Код символа
-
'L' - Псевдоним на этой платформе (Linux x86_64)
-
numpy.uint64: 64-битное целое число без знака (0до18_446_744_073_709_551_615). - Псевдоним на этой платформе (Linux x86_64)
-
numpy.uintp: Целое число без знака, достаточно большое, чтобы вместить указатель, совместимое с Cuintptr_t.
- класс numpy.ulonglong[source]
-
Целочисленный тип со знаком, совместимый с C
unsigned long long.- Код символа
-
'Q'
Вещественные типы
- класс numpy.inexact[source]
-
Абстрактный базовый класс всех числовых скалярных типов с (потенциально) приближённым представлением значений в своём диапазоне, таких как числа с плавающей точкой.
Примечание
Скаляры с плавающей точкой выводятся с наименьшим количеством десятичных знаков, необходимых для различения их значения от других значений того же типа данных, путём разумного округления. См. параметр unique format_float_positional и format_float_scientific.
Это означает, что переменные с одинаковыми двоичными значениями, но типами данных различной точности, могут отображаться по-разному:
>>> 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.floating[source]
-
Абстрактный базовый класс всех скалярных типов чисел с плавающей точкой.
- класс numpy.half[source]
-
Тип чисел с плавающей запятой полуточной точности.
- Код символа
-
'e' - Псевдоним на этой платформе (Linux x86_64)
-
numpy.float16: Тип чисел с плавающей запятой 16-битной точности: бит знака, 5 бит порядка, 10 бит мантиссы.
- класс numpy.single[source]
-
Тип чисел с плавающей запятой одинарной точности, совместимый с C
float.- Код символа
-
'f' - Псевдоним на этой платформе (Linux x86_64)
-
numpy.float32: тип чисел с плавающей запятой 32-битной точности: бит знака, 8 бит порядка, 23 бита мантиссы.
- класс numpy.double(x=0, /)[source]
-
Тип чисел с плавающей запятой двойной точности, совместимый с Python
floatи Cdouble.- Код символа
-
'd' - Псевдоним
- Псевдоним на этой платформе (Linux x86_64)
-
numpy.float64: тип чисел с плавающей запятой 64-битной точности: бит знака, 11 бит порядка, 52 бита мантиссы.
- класс numpy.longdouble[source]
-
Тип чисел с плавающей запятой расширенной точности, совместимый с C
long double, но не обязательно с IEEE 754 четверичной точности.- Код символа
-
'g' - Псевдоним
- Псевдоним на этой платформе (Linux x86_64)
-
numpy.float128: тип чисел с плавающей запятой 128-битной расширенной точности.
Комплексные типы с плавающей запятой
- класс numpy.complexfloating[source]
-
Абстрактный базовый класс всех комплексных числовых типов скаляров, которые состоят из чисел с плавающей запятой.
- класс numpy.csingle[source]
-
Тип комплексных чисел, состоящий из двух чисел с плавающей запятой одинарной точности.
- Код символа
-
'F' - Псевдоним
- Псевдоним на этой платформе (Linux x86_64)
-
numpy.complex64: Тип комплексных чисел, составленный из двух чисел с плавающей запятой 32-битной точности.
- класс numpy.cdouble(real=0, imag=0)[source]
-
Тип комплексных чисел, состоящий из двух чисел с плавающей запятой двойной точности, совместимый с Python
complex.- Код символа
-
'D' - Псевдоним
- Псевдоним
- Псевдоним на этой платформе (Linux x86_64)
-
numpy.complex128: Тип комплексных чисел, составленный из 2 чисел с плавающей запятой 64-битной точности.
- класс numpy.clongdouble[source]
-
Тип комплексных чисел, состоящий из двух чисел с плавающей запятой расширенной точности.
- Код символа
-
'G' - Псевдоним
- Псевдоним
- Псевдоним на этой платформе (Linux x86_64)
-
numpy.complex256: Тип комплексных чисел, составленный из 2 чисел с плавающей запятой 128-битной расширенной точности.
Другие типы
- класс numpy.bool_[source]
-
Булевый тип (True или False), хранится как байт.
Предупреждение
Тип
bool_не является подклассом типаint_(типbool_даже не является числовым типом). Это отличается от стандартной реализации Pythonboolкак подклассаint.- Код символа
-
'?' - Псевдоним
- класс numpy.datetime64[source]
-
Если создано из 64-битного целого числа, оно представляет собой смещение от
1970-01-01T00:00:00. Если создано из строки, строка может быть в формате даты или времени ISO 8601.>>> np.datetime64(10, 'Y') numpy.datetime64('1980') >>> np.datetime64('1980', 'Y') numpy.datetime64('1980') >>> np.datetime64(10, 'D') numpy.datetime64('1970-01-11')См. Даты и временные интервалы для получения дополнительной информации.
- Код символа
-
'M'
- класс numpy.timedelta64[source]
-
Тип timedelta, хранящийся как 64-битное целое число.
Для получения дополнительной информации см. Даты и временные интервалы.
- Код символа
-
'm'
- класс numpy.object_[source]
-
Любой объект Python.
- Код символа
-
'O'
Примечание
Данные, фактически хранящиеся в массивах с объектами (т.е., массивы с типом object_), представляют собой ссылки на объекты Python, а не сами объекты. Следовательно, массивы объектов ведут себя больше как обычные Python lists, в том смысле, что их содержимое не обязательно должно быть одного типа Python.
Тип object также является специальным, поскольку массив, содержащий object_ элементы, не возвращает объект object_ при обращении к элементу, а вместо этого возвращает фактический объект, на который ссылается элемент массива.
Следующие типы данных являются гибкими: у них нет предопределенного размера, и данные, которые они описывают, могут иметь различную длину в различных массивах. (В кодах символов # — целое число, обозначающее количество элементов, из которых состоит тип данных.)
- класс numpy.flexible[source]
-
Абстрактный базовый класс всех скалярных типов без предопределенной длины. Фактический размер этих типов зависит от конкретной
np.dtypeинстанциации.
- класс numpy.bytes_[source]
-
Строка байтов.
При использовании в массивах этот тип удаляет завершающие нулевые байты.
- Код символа
-
'S' - Псевдоним
- класс numpy.str_[source]
-
Строка Unicode.
При использовании в массивах этот тип удаляет завершающие нулевые кодовые точки.
В отличие от встроенного
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[source]
-
Непрозрачная последовательность байтов или структура.
>>> np.void(b'abcd') void(b'\x61\x62\x63\x64')
Скаляры структурированных
voidмогут быть созданы только путем извлечения из Структурированных массивов:>>> arr = np.array((1, 2), dtype=[('x', np.int8), ('y', np.int8)]) >>> arr[()] (1, 2) # looks like a tuple, but is `np.void`- Код символа
-
'V'
Предупреждение
См. Примечание о строковых типах.
Совместимость числовых типов: если вы использовали старые символы типа кода в своем коде Numeric (что никогда не рекомендуется), вам необходимо изменить некоторые из них на новые символы. В частности, необходимые изменения — c -> S1, b -> B, 1 -> b, s -> h, w ->
H, и u -> I. Эти изменения делают соглашение о символах типа более согласованным с другими модулями Python, такими как struct модуль.
Псевдонимы с размером
Вместе со своими (по большей части) производными от C именами целочисленные, вещественные и комплексные типы данных также доступны с использованием соглашения о ширине бита, чтобы всегда гарантировать массив нужного размера. Также предоставляются два псевдонима (numpy.intp и numpy.uintp), указывающие на целочисленный тип, достаточно большой для хранения указателя C.
- numpy.bool8[source]
-
Псевдоним
numpy.bool_
- numpy.int8[source]
- numpy.int16
- numpy.int32
- numpy.int64
-
Псевдонимы для знаковых целочисленных типов (один из
numpy.byte,numpy.short,numpy.intc,numpy.int_иnumpy.longlong) с указанным количеством битов.Совместимы с C99
int8_t,int16_t,int32_t, иint64_t, соответственно.
- numpy.uint8[source]
- numpy.uint16
- numpy.uint32
- numpy.uint64
-
Псевдонимы для беззнаковых целочисленных типов (один из
numpy.byte,numpy.short,numpy.intc,numpy.int_иnumpy.longlong) с указанным количеством битов.Совместимы с C99
uint8_t,uint16_t,uint32_t, иuint64_t, соответственно.
- numpy.intp[source]
-
Псевдоним для целочисленного типа со знаком (один из
numpy.byte,numpy.short,numpy.intc,numpy.int_иnp.longlong), который имеет такой же размер, как указатель.Совместим с C
intptr_t.- Код символа
-
'p'
- numpy.uintp[source]
-
Псевдоним для целочисленного типа без знака (один из
numpy.byte,numpy.short,numpy.intc,numpy.int_иnp.longlong), который имеет такой же размер, как указатель.Совместим с C
uintptr_t.- Код символа
-
'P'
- numpy.float16[source]
-
псевдоним для
numpy.half
- numpy.float32[source]
-
псевдоним для
numpy.single
- numpy.float64[source]
-
псевдоним для
numpy.double
- numpy.float96
- numpy.float128[source]
-
Псевдоним для
numpy.longdouble, названный по своему размеру в битах. Существование этих псевдонимов зависит от платформы.
- numpy.complex64[source]
-
псевдоним для
numpy.csingle
- numpy.complex128[source]
-
псевдоним для
numpy.cdouble
- numpy.complex192
- numpy.complex256[source]
-
Псевдоним для
numpy.clongdouble, названный по своему размеру в битах. Существование этих псевдонимов зависит от платформы.
Другие псевдонимы
Первые два из них являются удобствами, которые напоминают имена встроенных типов, в том же стиле, что и bool_, int_, str_, bytes_ и object_:
- numpy.float_[source]
-
псевдоним для
numpy.double
- numpy.complex_[source]
-
псевдоним для
numpy.cdouble
Некоторые другие используют альтернативные обозначения для чисел с плавающей запятой и комплексных чисел с расширенной точностью:
- numpy.longfloat[source]
-
псевдоним для
numpy.longdouble
- numpy.singlecomplex[source]
-
псевдоним для
numpy.csingle
- numpy.cfloat[source]
-
псевдоним для
numpy.cdouble
- numpy.longcomplex[source]
-
псевдоним для
numpy.clongdouble
- numpy.clongfloat[source]
-
псевдоним для
numpy.clongdouble
Следующие псевдонимы происходят из Python 2, и рекомендуется их не использовать в новом коде.
- numpy.string_[source]
-
псевдоним для
numpy.bytes_
- numpy.unicode_[source]
-
псевдоним для
numpy.str_
Атрибуты
Массивы скалярных объектов имеют array priority значение NPY_SCALAR_PRIORITY (-1 000 000.0). Они также (пока) не имеют атрибута ctypes. В остальном, они имеют те же атрибуты, что и массивы:
Целочисленное значение флагов. | |
Кортеж измерений массива. | |
Кортеж байтовых шагов в каждом измерении. | |
Количество измерений массива. | |
Указатель на начало данных. | |
Количество элементов в типе данных. | |
Длина одного элемента в байтах. | |
Атрибут скаляра, идентичный соответствующему атрибуту массива. | |
Получение описателя типа данных массива. | |
Вещественная часть скаляра. | |
Мнимая часть скаляра. | |
Одномерный вид скаляра. | |
Атрибут скаляра, идентичный соответствующему атрибуту массива. | |
Протокол массива: сторона Python | |
Протокол массива: структура | |
Приоритет массива. | |
sc.__array_wrap__(obj) возвращает скаляр из массива |
Индексирование
См. также
Массивные скаляры могут быть индексированы как массивы нулевой размерности: если x — массивный скаляр,
-
x[()]возвращает копию массива скаляра -
x[...]возвращает массив нулевой размерностиndarray -
x['field-name']возвращает массивный скаляр в поле имя-поля. (x может иметь поля, например, когда он соответствует структурированному типу данных.)
Методы
Массивные скаляры имеют ровно те же методы, что и массивы. По умолчанию эти методы преобразуют скаляр во внутренний эквивалентный массив нулевой размерности и вызывают соответствующий метод массива. Кроме того, математические операции со скалярами массивов определены таким образом, что те же аппаратные флаги устанавливаются и используются для интерпретации результатов, как и для ufunc, поэтому состояние ошибки, используемое для ufunc, также переносится на математические операции со скалярами массивов.
Исключения из вышеуказанных правил приведены ниже:
sc.__array__(dtype) возвращает массив 0-мерности из скаляра со специфицированным типом данных | |
sc.__array_wrap__(obj) возвращает скаляр из массива | |
Метод скаляра, идентичный соответствующему атрибуту массива. | |
Метод скаляра, идентичный соответствующему атрибуту массива. | |
Помощник для сериализации. | |
Метод скаляра, идентичный соответствующему атрибуту массива. |
Определение новых типов
Существует два способа эффективного определения нового типа скаляра массива (кроме комбинирования структурированных типов dtypes из встроенных скалярных типов): Один способ — просто унаследовать от ndarray и переопределить интересующие методы. Это будет работать до определенной степени, но внутри некоторые поведения определяются типом данных массива. Чтобы полностью настроить тип данных массива, вам необходимо определить новый тип данных и зарегистрировать его в NumPy. Такие новые типы могут быть определены только на C, используя NumPy C-API.
© 2005–2022 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/1.21/reference/arrays.scalars.html