Spec-Zone.ru › NumPy 1.19

Скаляры

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

количество элементов в типе 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'] возвращает скаляр массива в поле field-name. (x может иметь поля, например, когда он соответствует структурированному типу данных.)

Методы

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

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

generic

Базовый класс для числовых типов NumPy.

generic.__array__()

sc.__array__(dtype) возвращает массив нулевой размерности из скаляра с указанным типом dtype

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–2020 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/1.19/reference/arrays.scalars.html

Spec-Zone.ru

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