Скаляры
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. В остальном они обладают теми же атрибутами, что и массивы:
целое значение флагов | |
кортеж размерностей массива | |
кортеж байтовых шагов в каждой размерности | |
количество размерностей массива | |
указатель на начало данных | |
количество элементов в типе gentype | |
длина одного элемента в байтах | |
базовый объект | |
получить описатель данных массива | |
действительная часть скаляра | |
мнимая часть скаляра | |
одномерный вид скаляра | |
транспонирование | |
протокол массива: сторона Python | |
протокол массива: структура | |
Приоритет массива. | |
sc.__array_wrap__(obj) возвращает скаляр из массива |
Индексирование
См. также
Скаляры массива могут индексироваться как массивы нулевой размерности: если x — скаляр массива,
-
x[()]возвращает копию скаляра массива -
x[...]возвращает 0-мерныйndarray -
x['field-name']возвращает скаляр массива в поле field-name. (x может иметь поля, например, когда он соответствует структурированному типу данных.)
Методы
Скаляры массивов имеют ровно такие же методы, как и массивы. По умолчанию эти методы выполняют внутреннее преобразование скаляра в эквивалентный массив нулевой размерности и вызывают соответствующий метод массива. Кроме того, операции математики над скалярами массива определены так, что те же флаги оборудования устанавливаются и используются для интерпретации результатов, как и для ufunc, поэтому состояние ошибки, используемое для ufuncs, также переносится на математику над скалярами массива.
Исключения из вышеперечисленных правил приведены ниже:
Базовый класс для числовых типов NumPy. | |
sc.__array__(dtype) возвращает массив нулевой размерности из скаляра с указанным типом dtype | |
sc.__array_wrap__(obj) возвращает скаляр из массива | |
Не реализовано (виртуальный атрибут) | |
Не реализовано (виртуальный атрибут) | |
Помощник для pickle. | |
Не реализовано (виртуальный атрибут) |
Определение новых типов
Существует два способа эффективного определения нового типа скаляра массива (кроме составления структурированных типов 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