Spec-Zone.ru › NumPy 1.17

Скаляры

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 размер фактического булевского значения не такой же, как у булевского скаляра 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#'
END_OF_DOCUMENT_MARKER

Предупреждение

См. Примечание по строковым типам.

Совместимость числовых типов: если в вашем коде Numeric использовались старые символы типа (что никогда не рекомендовалось), вам потребуется изменить некоторые из них на новые. В частности, необходимо произвести следующие изменения: c -> S1, b -> B, 1 -> b, s -> h, w -> H, и u -> I. Эти изменения делают соглашения по символам типа более согласованными с другими модулями Python, такими как struct модуль.

Атрибуты

Объекты скаляров массивов имеют атрибут NPY_SCALAR_PRIORITY со значением (-1 000 000.0). У них также пока нет атрибута ctypes. В остальном они имеют те же атрибуты, что и массивы:

generic.flags целочисленное значение флагов
generic.shape кортеж размерностей массива
generic.strides кортеж шагов в байтах для каждой размерности
generic.ndim количество размерностей массива
generic.data указатель на начало данных
generic.size количество элементов в типе
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[...] возвращает нульмерный ndarray
  • x['field-name'] возвращает скаляр массива в поле имя-поля. (x может иметь поля, например, когда он соответствует структурированному типу данных.)

Методы

Скаляры массивов имеют точно такие же методы, как и массивы. По умолчанию эти методы преобразуют скаляр во внутреннее эквивалентное нульмерный массив и вызывают соответствующий метод массива. Кроме того, операции над математическими скалярами массивов определены так, что устанавливаются и используются те же аппаратные флаги для интерпретации результатов, как для ufunc, поэтому состояние ошибки, используемое для ufuncs, также распространяется на математические операции над скалярами массивов.

Исключения из вышеуказанных правил приведены ниже:

generic Базовый класс для типов скаляров NumPy.
generic.__array__() sc.__array__(dtype) возвращает 0-мерный массив из скаляра с указанным типом
generic.__array_wrap__() sc.__array_wrap__(obj) возвращает скаляр из массива
generic.squeeze() Не реализовано (виртуальный атрибут)
generic.byteswap() Не реализовано (виртуальный атрибут)
generic.__reduce__() Вспомогательная функция для pickle.
generic.__setstate__()
generic.setflags() Не реализовано (виртуальный атрибут)

Определение новых типов

Существует два способа эффективного определения нового типа скаляра массива (кроме составления структурированных типов dtypes из встроенных скалярных типов): Один способ — просто унаследовать от ndarray и перезаписать интересующие методы. Это будет работать до определенной степени, но внутренне определённые поведения фиксируются типом данных массива. Для полного настройки типа данных массива необходимо определить новый тип данных и зарегистрировать его в NumPy. Такие новые типы могут быть определены только на C, используя NumPy C-API.

© 2005–2019 NumPy Developers
Licensed under the 3-clause BSD License.
https://docs.scipy.org/doc/numpy-1.17.0/reference/arrays.scalars.html

Spec-Zone.ru

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