Скаляры
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 размер фактического булевского значения не такой же, как у булевского скаляра 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 модуль.
Атрибуты
Объекты скаляров массивов имеют атрибут 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) возвращает скаляр из массива |
Индексирование
См. также
Скаляры массивов можно индексировать как нульмерные массивы: если 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