Spec-Zone.ru › NumPy 1.13

Скаляры

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).

../_images/dtype-hierarchy.png

Рисунок: Иерархия объектов типов, представляющих типы данных массивов. Не показаны два целочисленных типа 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_ при обращении к элементу, а возвращает фактический объект, на который ссылается элемент массива.

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

END_OF_DOCUMENT_MARKER
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) возвращает скаляр из массива

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

См. также

Индексирование, Объекты типов данных (dtype)

Скаляры массива можно индексировать как массивы нулевой размерности: если 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API