Скаляры
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 Boolean.
Предупреждение
Тип int_ не наследуется от встроенного int в Python 3, потому что тип int больше не является целочисленным типом с фиксированной шириной.
Подсказка
По умолчанию тип данных в NumPy — float_.
-
class numpy.generic[source] -
Базовый класс для типов NumPy скаляров.
Класс, от которого происходят большинство (все?) типов скаляров NumPy. Для согласованности, экспонирует тот же API, что и
ndarray, несмотря на то, что многие последующие атрибуты являются либо «только для чтения», либо совершенно нерелевантными. Это класс, от которого, по всей видимости, пользователи должны наследовать пользовательские типы скаляров.
-
class numpy.number[source] -
Абстрактный базовый класс всех числовых типов скаляров.
Целочисленные типы
-
class numpy.integer[source] -
Абстрактный базовый класс всех целочисленных типов скаляров.
Типы целых со знаком
-
class numpy.signedinteger[source] -
Абстрактный базовый класс всех целочисленных типов скаляров со знаком.
-
class numpy.byte[source] -
Целочисленный тип со знаком, совместимый с C
char.- Код символа
-
'b' - Псевдоним на этой платформе
-
numpy.int8: 8-битное целое со знаком (-128до127).
-
class numpy.short[source] -
Целочисленный тип со знаком, совместимый с C
short.- Код символа
-
'h' - Псевдоним на этой платформе
-
numpy.int16: 16-битное целое со знаком (-32_768до32_767).
-
class numpy.intc[source] -
Целочисленный тип со знаком, совместимый с C
int.- Код символа
-
'i' - Псевдоним на этой платформе
-
numpy.int32: 32-битное целое со знаком (-2_147_483_648до2_147_483_647).
-
class numpy.int_[source] -
Целочисленный тип со знаком, совместимый с Python
intи Clong.- Код символа
-
'l' - Псевдоним на этой платформе
-
numpy.int64: 64-битное целое со знаком (-9_223_372_036_854_775_808до9_223_372_036_854_775_807). - Псевдоним на этой платформе
-
numpy.intp: Целое со знаком, достаточно большое, чтобы вместить указатель, совместимый с Cintptr_t.
-
class numpy.longlong[source] -
Целочисленный тип со знаком, совместимый с C
long long.- Код символа
-
'q'
Целочисленные типы без знака
-
class numpy.unsignedinteger[source] -
Абстрактный базовый класс всех целочисленных скалярных типов без знака.
-
class numpy.ubyte[source] -
Целочисленный тип без знака, совместимый с C
unsigned char.- Код символа
-
'B' - Псевдоним на этой платформе
-
numpy.uint8: 8-битное целое без знака (0до255).
-
class numpy.ushort[source] -
Целочисленный тип без знака, совместимый с C
unsigned short.- Код символа
-
'H' - Псевдоним на этой платформе
-
numpy.uint16: 16-битное целое без знака (0до65_535).
-
class numpy.uintc[source] -
Целочисленный тип без знака, совместимый с C
unsigned int.- Код символа
-
'I' - Псевдоним на этой платформе
-
numpy.uint32: 32-битное целое без знака (0до4_294_967_295).
-
class numpy.uint[source] -
Целочисленный тип без знака, совместимый с C
unsigned long.- Код символа
-
'L' - Псевдоним на этой платформе
-
numpy.uint64: 64-битное целое без знака (0до18_446_744_073_709_551_615). - Псевдоним на этой платформе
-
numpy.uintp: Целое без знака, достаточно большое, чтобы вместить указатель, совместимый с Cuintptr_t.
-
class numpy.ulonglong[source] -
Целочисленный тип со знаком, совместимый с C
unsigned long long.- Код символа
-
'Q'
Вещественные типы
-
class numpy.inexact[source] -
Абстрактный базовый класс всех числовых скалярных типов с (возможно) неточным представлением значений в их диапазоне, таких как числа с плавающей точкой.
Типы с плавающей точкой
-
class numpy.floating[source] -
Абстрактный базовый класс всех скалярных типов с плавающей точкой.
-
class numpy.half[source] -
Тип числа с плавающей точкой половинной точности.
- Код символа
-
'e' - Псевдоним на этой платформе
-
numpy.float16: тип числа с плавающей точкой 16-битной точности: бит знака, 5 бит экспоненты, 10 бит мантиссы.
-
class numpy.single[source] -
Тип числа с плавающей точкой одинарной точности, совместимый с C
float.- Код символа
-
'f' - Псевдоним на этой платформе
-
numpy.float32: тип числа с плавающей точкой 32-битной точности: бит знака, 8 бит экспоненты, 23 бита мантиссы.
-
class numpy.double[source] -
Тип числа с плавающей точкой двойной точности, совместимый с Python
floatи Cdouble.- Код символа
-
'd' - Псевдоним
- Псевдоним на этой платформе
-
numpy.float64: тип числа с плавающей точкой 64-битной точности: бит знака, 11 бит экспоненты, 52 бита мантиссы.
-
class numpy.longdouble[source] -
Тип числа с плавающей точкой расширенной точности, совместимый с C
long double, но не обязательно с IEEE 754 четверной точности.- Код символа
-
'g' - Псевдоним
- Псевдоним на этой платформе
-
numpy.float128: тип числа с плавающей точкой расширенной 128-битной точности.
Комплексные типы с плавающей точкой
-
class numpy.complexfloating[source] -
Абстрактный базовый класс всех скалярных типов комплексных чисел, состоящих из чисел с плавающей точкой.
-
class numpy.csingle[source] -
Тип комплексного числа, состоящий из двух чисел с плавающей точкой одинарной точности.
- Код символа
-
'F' - Псевдоним
- Псевдоним на этой платформе
-
numpy.complex64: Тип комплексного числа, состоящий из 2 чисел с плавающей точкой 32-битной точности.
-
class numpy.cdouble[source] -
Тип комплексного числа, составленный из двух чисел с плавающей точкой двойной точности, совместимый с Python
complex.- Код символа
-
'D' - Псевдоним
- Псевдоним
- Псевдоним на этой платформе
-
numpy.complex128: Тип комплексного числа, составленный из 2 чисел с плавающей точкой 64-битной точности.
-
class numpy.clongdouble[source] -
Тип комплексного числа, составленный из двух чисел с плавающей точкой расширенной точности.
- Код символа
-
'G' - Псевдоним
- Псевдоним
- Псевдоним на этой платформе
-
numpy.complex256: Тип комплексного числа, составленный из 2 чисел с плавающей точкой 128-битной расширенной точности.
Другие типы
-
class numpy.bool_[source] -
Булевый тип (True или False), хранится как байт.
Предупреждение
Тип
bool_не является подклассом типаint_(типbool_даже не является числовым типом). Это отличается от стандартной реализации Pythonboolв качестве подклассаint.- Код символа
-
'?' - Псевдоним
-
class numpy.datetime64[source] -
Дата и время, хранящиеся как 64-битное целое число, отсчитываемое от
1970-01-01T00:00:00.>>> np.datetime64(10, 'Y') numpy.datetime64('1980') >>> np.datetime64(10, 'D') numpy.datetime64('1970-01-11')См. Даты и временные интервалы для получения дополнительной информации.
- Код символа
-
'M'
-
class numpy.timedelta64[source] -
Временной интервал, хранящийся как 64-битное целое число.
См. Даты и временные интервалы для получения дополнительной информации.
- Код символа
-
'm'
-
class numpy.object_[source] -
Любой объект Python.
- Код символа
-
'O'
Примечание
Данные, фактически хранящиеся в массивах объектов (т.е., массивах с типом данных object_), являются ссылками на объекты Python, а не на сами объекты. Следовательно, массивы объектов ведут себя больше как обычные Python lists, в том смысле, что их содержимое не обязательно должно быть одного типа Python.
Тип объекта также является особым, потому что массив, содержащий элементы object_, не возвращает объект object_ при доступе к элементу, а вместо этого возвращает фактический объект, на который ссылается элемент массива.
Следующие типы данных являются гибкими: у них нет предварительно определенного размера, и данные, которые они описывают, могут иметь различную длину в различных массивах. (В кодах символов # — целое число, обозначающее количество элементов, из которых состоит тип данных.)
-
class numpy.flexible[source] -
Абстрактный базовый класс всех типов скаляров без предварительно определенной длины. Фактический размер этих типов зависит от конкретной
np.dtypeинстанциации.
-
class numpy.bytes_[source] -
Строка байтов.
При использовании в массивах этот тип удаляет завершающие нулевые байты.
- Код символа
-
'S' - Псевдоним
-
class numpy.str_[source] -
Строка Юникод.
При использовании в массивах этот тип удаляет завершающие нулевые кодовые точки.
В отличие от встроенной
str, это поддерживает Протокол буфера, экспонируя его содержимое как UCS4:>>> m = memoryview(np.str_("abc")) >>> m.format '3w' >>> m.tobytes() b'a\x00\x00\x00b\x00\x00\x00c\x00\x00\x00'- Код символа
-
'U' - Псевдоним
-
class 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) возвращает массив нулевой размерности из скаляра с указанным типом dtype | |
sc.__array_wrap__(obj) возвращает скаляр из массива | |
Метод скаляра, идентичный соответствующему атрибуту массива. | |
Метод скаляра, идентичный соответствующему атрибуту массива. | |
Помощник для pickle. | |
Метод скаляра, идентичный соответствующему атрибуту массива. |
Определение новых типов
Существует два способа эффективного определения нового типа массивного скаляра (кроме построения структурированных типов dtypes из встроенных скалярных типов): Один способ — просто унаследовать от ndarray и переопределить интересующие методы. Это будет работать до определенной степени, но внутренние особенности определяются типом данных массива. Для полной настройки типа данных массива необходимо определить новый тип данных и зарегистрировать его в NumPy. Такие новые типы можно определить только на C, используя NumPy C-API.
© 2005–2021 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/1.20/reference/arrays.scalars.html