Скаляры
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 |
|---|---|
|
|
|
|
|
|
|
|
|
|
Тип данных 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 указана: два типа совместимы, если их данные имеют одинаковый размер и интерпретируются одинаково.
Булевы значения:
Тип | Примечания | Код символа |
|---|---|---|
| совместимо: Python bool |
|
| 8 бит |
Целые числа:
| совместимо: C char |
|
| совместимо: C short |
|
| совместимо: C int |
|
| совместимо: Python int |
|
| совместимо: C long long |
|
| достаточно большой для указателя |
|
| 8 бит | |
| 16 бит | |
| 32 бит | |
| 64 бит |
Беззнаковые целые числа:
| совместимо: C unsigned char |
|
| совместимо: C unsigned short |
|
| совместимо: C unsigned int |
|
| совместимо: Python int |
|
| совместимо: C long long |
|
| достаточно большой для указателя |
|
| 8 бит | |
| 16 бит | |
| 32 бит | |
| 64 бит |
Числа с плавающей точкой:
|
| |
| совместимо: C float |
|
| совместимо: C double | |
| совместимо: Python float |
|
| совместимо: C long float |
|
| 16 бит | |
| 32 бит | |
| 64 бит | |
| 96 бит, платформа? | |
| 128 бит, платформа? |
Комплексные числа с плавающей точкой:
|
| |
| совместимо: Python complex |
|
|
| |
| два 32-битных числа с плавающей точкой | |
| два 64-битных числа с плавающей точкой | |
| два 96-битных числа с плавающей точкой, платформа? | |
| два 128-битных числа с плавающей точкой, платформа? |
Любой объект Python:
| любой объект Python |
|
Примечание
Данные, фактически хранящиеся в массивах объектов (т. е., массивах с типом данных object_ ), являются ссылками на объекты Python, а не сами объекты. Следовательно, массивы объектов ведут себя больше как обычные Python lists, в том смысле, что их содержимое необязательно должно быть одного и того же типа Python.
Тип объекта также является особым, так как массив, содержащий object_ элементов, при доступе к элементу не возвращает объект object_, а вместо этого возвращает фактический объект, на который ссылается элемент массива.
Следующие типы данных являются гибкими: у них нет предопределенного размера, и данные, которые они описывают, могут иметь разную длину в разных массивах. (В кодах символов # — целое число, обозначающее количество элементов, из которых состоит тип данных.)
| совместимо: Python bytes |
|
| совместимо: Python unicode/str |
|
|
|
Предупреждение
Числовая совместимость: Если в вашем коде 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. В остальном, они имеют те же атрибуты, что и массивы:
целочисленное значение флагов | |
кортеж размерностей массива | |
кортеж шагов в байтах для каждой размерности | |
количество размерностей массива | |
указатель на начало данных | |
количество элементов в типе | |
длина одного элемента в байтах | |
базовый объект | |
получение описателя данных массива | |
действительная часть скаляра | |
мнимая часть скаляра | |
одномерный вид скаляра | |
транспонирование | |
Протокол массива: сторона Python | |
Протокол массива: структура | |
Приоритет массива. | |
sc.__array_wrap__(obj) возвращает скаляр из массива |
Индексирование
См. также
Скаляры массивов могут индексироваться как массивы нулевой размерности: если x — скаляр массива,
-
x[()]возвращает копию скаляра массива -
x[...]возвращает 0-мерныйndarray -
x['field-name']возвращает скаляр массива в поле имя-поля. (x может иметь поля, например, когда он соответствует структурированному типу данных.)
Методы
Скаляры массивов имеют ровно те же методы, что и массивы. По умолчанию эти методы внутри преобразуют скаляр в эквивалентный массив нулевой размерности и вызывают соответствующий метод массива. Кроме того, математические операции со скалярами массивов определены таким образом, что устанавливаются и используются те же аппаратные флаги для интерпретации результатов, как и для ufunc, поэтому состояние ошибки, используемое для ufunc, также переносится на математику со скалярами массивов.
Исключения из вышеуказанных правил приведены ниже:
Базовый класс для типов скаляров NumPy. | |
sc.__array__(dtype) возвращает массив нулевой размерности из скаляра с заданным типом | |
sc.__array_wrap__(obj) возвращает скаляр из массива | |
Не реализовано (виртуальный атрибут) | |
Не реализовано (виртуальный атрибут) | |
Помощник для сериализации. | |
Не реализовано (виртуальный атрибут) |
Определение новых типов
Существует два способа эффективного определения нового типа скаляра массива (помимо составления структурированных типов 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