Spec-Zone.ru › NumPy 1.18

Скаляры

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 не совпадает с размером скаляра Boolean 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

количество элементов в типе

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__(dtype) возвращает массив нулевой размерности из скаляра с заданным типом

generic.__array_wrap__()

sc.__array_wrap__(obj) возвращает скаляр из массива

generic.squeeze()

Не реализовано (виртуальный атрибут)

generic.byteswap()

Не реализовано (виртуальный атрибут)

generic.__reduce__()

Помощник для сериализации.

generic.__setstate__()

generic.setflags()

Не реализовано (виртуальный атрибут)

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

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

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

Spec-Zone.ru

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