Скаляры
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 — один из гибких типов массивов с изменяемым размером элементов (string, unicode, void).
Рисунок: Иерархия объектов типов, представляющих типы данных массивов. Не показаны два целочисленных типа intp и uintp, которые просто ссылаются на целочисленный тип, содержащий указатель для платформы. Все числовые типы также могут быть получены с помощью имён битовой ширины.
| [1] | Однако массивно-скалярные типы неизменяемы, поэтому ни один из атрибутов массивно-скалярных типов не может быть изменён. |
Встроенные скалярные типы
Ниже показаны встроенные скалярные типы. Наряду с их (в основном) именами, полученными из C, целочисленные, вещественные и комплексные типы данных также доступны с использованием соглашения о ширине разряда, чтобы всегда гарантировать массив нужного размера (например, int8, float64, complex128). Также предоставляются два псевдонима (intp и uintp ), указывающие на целочисленный тип, достаточно большой для хранения указателя C. Имена, похожие на имена из C, связаны с кодами символов, которые показаны в таблице. Тем не менее, использование кодов символов не рекомендуется.
Некоторые типы скаляров по сути эквивалентны основным типам Python и поэтому наследуют их, а также общий тип массивно-скалярных типов:
| Тип массивно-скалярного объекта | Соответствующий тип Python |
|---|---|
int_ |
IntType (только Python 2) |
float_ | FloatType |
complex_ | ComplexType |
bytes_ | BytesType |
unicode_ | UnicodeType |
Тип bool_ очень похож на тип Python BooleanType, но не наследует его, потому что тип Python BooleanType не позволяет наследоваться от него, а на уровне C размер фактического булевого типа не такой, как у скаляра типа bool в Python.
Предупреждение
Тип bool_ не является подклассом типа int_ (тип bool_ даже не является числовым типом). Это отличается от реализации Python по умолчанию bool как подкласса int.
Предупреждение
Тип int_ не наследуется от встроенного типа int в Python 3, потому что тип int больше не является целочисленным типом фиксированной ширины.
Подсказка
По умолчанию тип данных в NumPy — float_.
В таблицах ниже platform? означает, что тип может быть недоступен на всех платформах. Совместимость с различными типами C или Python указывается: два типа совместимы, если их данные имеют одинаковый размер и интерпретируются одинаковым образом.
Булевы типы:
| Тип | Примечания | Код символа |
|---|---|---|
bool_ | совместим: Python bool | '?' |
bool8 | 8 бит |
Целочисленные типы:
byte | совместим: C char | 'b' |
short | совместим: C short | 'h' |
intc | совместим: C int | 'i' |
int_ | совместим: Python int | 'l' |
longlong | совместим: C long long | 'q' |
intp | достаточно большой, чтобы вместить указатель | 'p' |
int8 | 8 бит | |
int16 | 16 бит | |
int32 | 32 бит | |
int64 | 64 бит |
Беззнаковые целочисленные типы:
ubyte | совместим: C unsigned char | 'B' |
ushort | совместим: C unsigned short | 'H' |
uintc | совместим: C unsigned int | 'I' |
uint | совместим: Python int | 'L' |
ulonglong | совместим: C long long | 'Q' |
uintp | достаточно большой, чтобы вместить указатель | 'P' |
uint8 | 8 бит | |
uint16 | 16 бит | |
uint32 | 32 бит | |
uint64 | 64 бит |
Вещественные числа с плавающей точкой:
half | 'e' | |
single | совместим: C float | 'f' |
double | совместим: C double | |
float_ | совместим: Python float | 'd' |
longfloat | совместим: C long float | 'g' |
float16 | 16 бит | |
float32 | 32 бит | |
float64 | 64 бит | |
float96 | 96 бит, платформа? | |
float128 | 128 бит, платформа? |
Комплексные вещественные числа с плавающей точкой:
csingle | 'F' | |
complex_ | совместим: Python complex | 'D' |
clongfloat | 'G' | |
complex64 | два 32-битных числа с плавающей точкой | |
complex128 | два 64-битных числа с плавающей точкой | |
complex192 | два 96-битных числа с плавающей точкой, платформа? | |
complex256 | два 128-битных числа с плавающей точкой, платформа? |
Любой объект Python:
object_ | любой объект Python | 'O' |
Примечание
Данные, фактически хранящиеся в массивах объектов (т.е., массивах с типом данных object_) — это ссылки на объекты Python, а не сами объекты. Следовательно, массивы объектов ведут себя больше как обычные Python-списки lists, в том смысле, что их содержимое не обязательно должно быть одного типа Python.
Тип объекта также является особым, потому что массив, содержащий object_ элемента, не возвращает объект object_ при обращении к элементу, а возвращает фактический объект, на который ссылается элемент массива.
Следующие типы данных являются гибкими. У них нет предопределённого размера: данные, которые они описывают, могут иметь разную длину в разных массивах. (В кодах символов # — целое число, обозначающее количество элементов, из которых состоит тип данных.)
bytes_ | совместимо: Python bytes | 'S#' |
unicode_ | совместимо: Python unicode/str | 'U#' |
void | 'V#' |
Предупреждение
См. Примечание по строковым типам.
Числовая совместимость: Если вы использовали старые символы типа в своём коде Numeric (что никогда не рекомендовалось), вам нужно будет изменить некоторые из них на новые символы. В частности, необходимые изменения — c -> S1, b -> B, 1 -> b, s -> h, w ->
H, и u -> I. Эти изменения делают соглашение о символах типа более согласованным с другими модулями Python, такими как модуль struct.
Атрибуты
Объекты скаляров массива имеют array priority значения 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 | базовый объект |
generic.dtype | получить описатель данных массива |
generic.real | вещественная часть скаляра |
generic.imag | мнимая часть скаляра |
generic.flat | одномерный вид скаляра |
generic.T | транспонирование |
generic.__array_interface__ | протокол массива: сторона Python |
generic.__array_struct__ | протокол массива: структура |
generic.__array_priority__ | Приоритет массива. |
generic.__array_wrap__ | sc.__array_wrap__(obj) возвращает скаляр из массива |
Индексирование
См. также
Скаляры массива можно индексировать как массивы нулевой размерности: если x — скаляр массива,
-
x[()]возвращает копию скаляра массива -
x[...]возвращает 0-мерныйndarray -
x['field-name']возвращает скаляр массива в поле имя_поля. (x может иметь поля, например, когда он соответствует структурированному типу данных.)
Методы
Скаляры массива имеют точно такие же методы, как и массивы. По умолчанию эти методы преобразуют скаляр во внутреннее эквивалентное массив нулевой размерности и вызывают соответствующий метод массива. Кроме того, математические операции со скалярами массивов определены таким образом, что устанавливаются и используются те же флаги аппаратного обеспечения для интерпретации результатов, что и для ufunc, поэтому состояние ошибок, используемое для ufunc, также распространяется на математические операции со скалярами массивов.
Исключения из вышеуказанных правил приведены ниже:
generic | Базовый класс для типов скаляров NumPy. |
generic.__array__ | sc.__array__(|type) возвращает 0-мерный массив |
generic.__array_wrap__ | sc.__array_wrap__(obj) возвращает скаляр из массива |
generic.squeeze | Не реализовано (виртуальный атрибут) |
generic.byteswap | Не реализовано (виртуальный атрибут) |
generic.__reduce__ | |
generic.__setstate__ | |
generic.setflags | Не реализовано (виртуальный атрибут) |
Определение новых типов
Существует два способа эффективного определения нового типа скаляра массива (кроме составления структурированных типов dtypes из встроенных скалярных типов): Один способ — просто унаследовать от ndarray и перезаписать интересующие методы. Это будет работать до определённой степени, но во внутренней части определённое поведение фиксируется типом данных массива. Чтобы полностью настроить тип данных массива, необходимо определить новый тип данных и зарегистрировать его в NumPy. Такие новые типы можно определить только на C, используя NumPy C-API.
© 2008–2017 NumPy Developers
Licensed under the NumPy License.
https://docs.scipy.org/doc/numpy-1.13.0/reference/arrays.scalars.html