Объекты типов данных (dtype)
Объект типа данных (экземпляр класса numpy.dtype) описывает, как интерпретировать байты в фиксированном блоке памяти, соответствующем элементу массива. Он описывает следующие аспекты данных:
- Тип данных (целое число, вещественное число, объект Python и т. д.)
- Размер данных (сколько байтов, например, в целом числе)
- Порядок байтов данных (маленький порядок или большой порядок)
-
Если тип данных — структурированный тип данных, агрегат других типов данных (например, описывающий элемент массива, состоящий из целого числа и вещественного числа),
- как называются «поля» структуры, с помощью которых к ним можно обратиться,
- какой тип данных имеет каждое поле, и
- какую часть блока памяти занимает каждое поле.
- Если тип данных — подмассив, каковы его форма и тип данных.
Для описания типа скалярных данных в NumPy имеются несколько встроенных скалярных типов различной точности для целых чисел, чисел с плавающей точкой и т. д. Элемент, извлеченный из массива, например, с помощью индексирования, будет объектом Python, тип которого — скалярный тип, связанный с типом данных массива.
Обратите внимание, что скалярные типы не являются объектами dtype, хотя их можно использовать вместо них, когда требуется указание типа данных в NumPy.
Структурированные типы данных создаются путем создания типа данных, поле которого содержит другие типы данных. Каждое поле имеет имя, по которому к нему можно обратиться. Родительский тип данных должен быть достаточного размера для всех его полей; он почти всегда основан на типе void, который позволяет произвольный размер элемента. Структурированные типы данных также могут содержать вложенные структурированные подмассивы в своих полях.
Наконец, тип данных может описывать элементы, которые сами являются массивами элементов другого типа данных. Однако эти подмассивы должны иметь фиксированный размер.
Если массив создается с использованием типа данных, описывающего подмассив, размеры подмассива добавляются к форме массива при создании массива. Подмассивы в поле структурированного типа ведут себя по-другому, см. Доступ к полям.
Подмассивы всегда имеют упорядоченную в памяти компоновку C.
Пример
Простой тип данных, содержащий 32-битное целое число в формате big-endian: (подробнее о создании см. Указание и создание типов данных)
>>> dt = np.dtype('>i4')
>>> dt.byteorder
'>'
>>> dt.itemsize
4
>>> dt.name
'int32'
>>> dt.type is np.int32
True
Соответствующий скалярный тип массива — int32.
Пример
Структурированный тип данных, содержащий 16-символьную строку (в поле «имя») и подмассив из двух 64-битных чисел с плавающей точкой (в поле «оценки»):
>>> dt = np.dtype([('name', np.unicode_, 16), ('grades', np.float64, (2,))])
>>> dt['name']
dtype('<U16')
>>> dt['grades']
dtype(('<f8', (2,)))
Элементы массива этого типа данных заключены в скалярный тип массива, у которого также есть два поля:
>>> x = np.array([('Sarah', (8.0, 7.0)), ('John', (6.0, 7.0))], dtype=dt)
>>> x[1]
('John', [6., 7.])
>>> x[1]['grades']
array([6., 7.])
>>> type(x[1])
<class 'numpy.void'>
>>> type(x[1]['grades'])
<class 'numpy.ndarray'>
Указание и создание типов данных
В любой функции или методе NumPy, где требуется тип данных, можно предоставить либо объект dtype, либо то, что может быть преобразовано в него. Такие преобразования выполняются конструктором dtype:
|
Ниже описывается, что может быть преобразовано в объект типа данных:
-
dtypeобъект -
Используется как есть.
- None
-
По умолчанию тип данных:
float_.
- Массивно-скалярные типы
-
Все 24 встроенных объекты массивно-скалярного типа преобразуются в соответствующий объект типа данных. Это верно и для их подклассов.
Обратите внимание, что не вся информация о типе данных может быть предоставлена с помощью объекта типа: например, типы данных
flexibleимеют значение по умолчанию itemsize 0 и требуют явного указания размера, чтобы быть полезными.Пример
>>> dt = np.dtype(np.int32) # 32-bit integer >>> dt = np.dtype(np.complex128) # 128-bit complex floating-point number
- Общетиповые типы
-
Объекты общетиповых иерархических типов преобразуются в соответствующие объекты типов в соответствии с ассоциациями:
characterstringУстарело начиная с версии 1.19: Это преобразование общетиповых скалярных типов устарело. Это связано с тем, что оно может быть неожиданным в контексте, таком как
arr.astype(dtype=np.floating), который преобразует массивfloat32в массивfloat64, хотяfloat32является подтипомnp.floating. - Встроенные типы Python
-
Несколько типов Python эквивалентны соответствующему массивно-скалярному типу при использовании для генерации объекта
dtype:buffer(все остальные)
Обратите внимание, что
strотносится к нуль-терминированным байтам или строкам Юникода в зависимости от версии Python. В коде, ориентированном на Python 2 и 3, следует использоватьnp.unicode_в качестве типа данных для строк. См. Примечание о строчных типах.Пример
>>> dt = np.dtype(float) # Python-compatible floating-point number >>> dt = np.dtype(int) # Python-compatible integer >>> dt = np.dtype(object) # Python object
Примечание
Все остальные типы отображаются на
object_для удобства. Код должен ожидать, что такие типы могут отображаться на определенный (новый) тип данных в будущем. - Типы с атрибутом
.dtype -
Любой объект типа с атрибутом
dtype: Атрибут будет доступен и использован напрямую. Атрибут должен возвращать что-то, что может быть преобразовано в объект типа данных.
Можно преобразовать несколько типов строк. Распознаваемые строки могут быть снабжены префиксом '>' (big-endian), '<' (little-endian) или '=' (родной для аппаратной платформы, по умолчанию), чтобы указать порядок байтов.
- Строки из одного символа
-
Каждый встроенный тип данных имеет код символа (обновленные коды типов Numeric), который однозначно его идентифицирует.
Пример
>>> dt = np.dtype('b') # byte, native byte order >>> dt = np.dtype('>H') # big-endian unsigned short >>> dt = np.dtype('<f') # little-endian single-precision float >>> dt = np.dtype('d') # double-precision floating-point number - Строки типа протокола массивов (см. Интерфейс массивов)
-
Первый символ указывает тип данных, а оставшиеся символы указывают количество байтов на элемент, за исключением Юникода, где он интерпретируется как количество символов. Размер элемента должен соответствовать существующему типу, иначе будет выдано сообщение об ошибке. Поддерживаемые типы:
'?'булево
'b'(знаковый) байт
'B'(беззнаковый) байт
'i'(знаковый) целое число
'u'(беззнаковый) целое число
'f'вещественное число с плавающей запятой
'c'комплексное вещественное число с плавающей запятой
'm'timedelta
'M'datetime
'O'(объекты Python)
'S','a'строка байтов с нулевым завершением (не рекомендуется)
'U'строка Юникода
'V'сырые данные (
void)Пример
>>> dt = np.dtype('i4') # 32-bit signed integer >>> dt = np.dtype('f8') # 64-bit floating-point number >>> dt = np.dtype('c16') # 128-bit complex floating-point number >>> dt = np.dtype('a25') # 25-length zero-terminated bytes >>> dt = np.dtype('U25') # 25-character stringПримечание о строчных типах
Для обратной совместимости с Python 2 типы
Sиaостаются строками байтов с нулевым завершением, аnumpy.string_по-прежнему является псевдонимомnumpy.bytes_. Для использования реальных строк в Python 3 используйтеUилиnumpy.str_. Для знакомых байтов, не требующих нулевого завершения, можно использоватьbилиi1. - Строка с полями, разделенными запятыми
-
Краткая запись для задания формата структурированного типа данных — строка с базовыми форматами, разделенными запятыми.
Базовый формат в данном контексте — это необязательный указатель формы, за которым следует строка типа протокола массива. Скобки обязательны для формы, если она имеет более одной размерности. NumPy допускает модификацию формата, в том смысле, что любой строкой, которая может однозначно идентифицировать тип, можно использовать для задания типа данных в поле. Созданные поля типа данных называются
'f0','f1', …,'f<N-1>'где N (>1) — количество базовых форматов, разделенных запятыми, в строке. Если указатель формы предоставлен, то тип данных для соответствующего поля описывает подмассив.Пример
- поле с именем
f0, содержащее 32-битовое целое число - поле с именем
f1, содержащее подмассив 2x3 64-битных чисел с плавающей запятой - поле с именем
f2, содержащее 32-битное число с плавающей запятой
>>> dt = np.dtype("i4, (2,3)f8, f4")- поле с именем
f0, содержащее строку из 3 символов - поле с именем
f1содержащее подмассив формы (3,) с 64-битными беззнаковыми целыми числами - поле с именем
f2содержащее подмассив 3x4, содержащий строки из 10 символов
>>> dt = np.dtype("a3, 3u8, (3,4)a10") - поле с именем
- Строки типа
-
Любая строка в
numpy.sctypeDict.keys():Пример
>>> dt = np.dtype('uint32') # 32-bit unsigned integer >>> dt = np.dtype('float64') # 64-bit floating-point number
(flexible_dtype, itemsize)-
Первый аргумент должен быть объектом, преобразуемым в объект гибкого типа размером ноль, второй аргумент — целое число, задающее желаемый размер элемента.
Пример
>>> dt = np.dtype((np.void, 10)) # 10-byte wide data block >>> dt = np.dtype(('U', 10)) # 10-character unicode string (fixed_dtype, shape)-
Первый аргумент — любой объект, который может быть преобразован в объект фиксированного типа данных. Второй аргумент — желаемая форма этого типа. Если параметр формы равен 1, то объект типа данных эквивалентен фиксированному типу. Это поведение устарело с NumPy 1.17 и в будущем будет вызывать ошибку. Если shape является кортежем, новый тип данных определяет подмассив заданной формы.
Пример
>>> dt = np.dtype((np.int32, (2,2))) # 2 x 2 integer sub-array >>> dt = np.dtype(('i4, (2,3)f8, f4', (2,3))) # 2 x 3 structured sub-array
[(field_name, field_dtype, field_shape), ...]-
obj должен быть списком полей, где каждое поле описывается кортежем длиной 2 или 3. (Эквивалентно элементу
descrв атрибуте__array_interface__.)Первый элемент, field_name, — имя поля (если это
'', то присваивается стандартное имя поля,'f#'). Имя поля также может быть кортежем из двух строк, где первая строка — «заголовок» (который может быть любой строкой или строкой Юникод) или метаданные для поля, которые могут быть любым объектом, а вторая строка — «имя», которое должно быть допустимым идентификатором Python.Второй элемент, field_dtype, может быть чем угодно, что может быть интерпретировано как тип данных.
Необязательный третий элемент field_shape содержит форму, если это поле представляет массив типа данных во втором элементе. Обратите внимание, что кортеж из 3 элементов с третьим аргументом, равным 1, эквивалентен кортежу из 2 элементов.
Этот стиль не принимает align в конструкторе
dtype, так как предполагается, что вся память учтена описанием интерфейса массива.Пример
Тип данных с полями
big(целое 32-битное число в формате big-endian) иlittle(целое 32-битное число в формате little-endian):>>> dt = np.dtype([('big', '>i4'), ('little', '<i4')])Тип данных с полями
R,G,B,A, каждое из которых — беззнаковое 8-битное целое число:>>> dt = np.dtype([('R','u1'), ('G','u1'), ('B','u1'), ('A','u1')])
{'names': ..., 'formats': ..., 'offsets': ..., 'titles': ..., 'itemsize': ...}-
Этот стиль имеет два обязательных и три необязательных ключа. Ключи names и formats являются обязательными. Их соответствующие значения — списки равной длины с именами полей и форматами полей. Имена полей должны быть строками, а форматы полей — любыми объектами, принимаемыми конструктором
dtype.Когда предоставляются необязательные ключи offsets и titles, их значения должны быть списками той же длины, что и списки names и formats. Значение offsets — список байтовых смещений (ограниченных
ctypes.c_int) для каждого поля, а значение titles — список заголовков для каждого поля (Noneможно использовать, если для этого поля заголовок не требуется). Заголовки titles могут быть любыми объектами, но когда объектstrдобавит ещё одну запись в словарь полей с ключом, соответствующим заголовку, и со ссылкой на тот же кортеж полей, который будет содержать заголовок в качестве дополнительного члена кортежа.Ключ itemsize позволяет установить общий размер типа данных и должен быть целым числом, достаточно большим для того, чтобы все поля поместились в типе данных. Если создаваемый тип данных выровнен, itemsize также должен быть кратен выравниванию структуры. Общий размер типа данных itemsize ограничен
ctypes.c_int.Пример
Тип данных с полями
r,g,b,a, каждое из которых — беззнаковое 8-битное целое число:>>> dt = np.dtype({'names': ['r','g','b','a'], ... 'formats': [np.uint8, np.uint8, np.uint8, np.uint8]})Тип данных с полями
rиb(с заданными заголовками), оба являющиеся беззнаковыми 8-битными целыми числами, первое — в байтовой позиции 0 от начала поля, а второе — в позиции 2:>>> dt = np.dtype({'names': ['r','b'], 'formats': ['u1', 'u1'], ... 'offsets': [0, 2], ... 'titles': ['Red pixel', 'Blue pixel']}) {'field1': ..., 'field2': ..., ...}-
Это использование не рекомендуется, так как оно неоднозначно с другим методом построения на основе словаря. Если у вас есть поле с именем «names» и поле с именем «formats», возникнет конфликт.
Этот стиль позволяет передавать атрибут
fieldsобъекта типа данных.obj должен содержать строковые или строковые ключи Юникод, которые ссылаются на
(data-type, offset)или(data-type, offset, title)кортежи.Пример
Тип данных, содержащий поле
col1(строка длиной 10 символов в байтовой позиции 0),col2(32-битное число с плавающей точкой в байтовой позиции 10) иcol3(целые числа в байтовой позиции 14):>>> dt = np.dtype({'col1': ('U10', 0), 'col2': (np.float32, 10), ... 'col3': (int, 14)}) (base_dtype, new_dtype)-
В NumPy 1.7 и более поздних версиях эта форма позволяет
base_dtypeинтерпретироваться как структурированный тип данных. Массивы, созданные с этим типом данных, будут иметь базовый типbase_dtype, но будут иметь поля и флаги, взятые изnew_dtype. Это полезно для создания пользовательских структурированных типов данных, как это делается в массивах записей.Эта форма также позволяет указать типы структур с перекрывающимися полями, функционируя как тип «union» в C. Однако это использование не рекомендуется, и предпочтительнее механизм объединения.
Оба аргумента должны быть преобразуемы в объекты типа данных с одинаковым общим размером.
Пример
32-битное целое число, первые два байта которого интерпретируются как целое число через поле
real, а следующие два байта — через полеimag.>>> dt = np.dtype((np.int32,{'real':(np.int16, 0),'imag':(np.int16, 2)}))32-битное целое число, которое интерпретируется как состоящее из подмассива формы
(4,), содержащего 8-битные целые числа:>>> dt = np.dtype((np.int32, (np.int8, 4)))
32-битное целое число, содержащее поля
r,g,b,a, которые интерпретируют 4 байта в целом числе как четыре беззнаковых целых числа:>>> dt = np.dtype(('i4', [('r','u1'),('g','u1'),('b','u1'),('a','u1')]))
dtype
Описания типов данных NumPy являются экземплярами класса dtype.
Атрибуты
Тип данных описывается следующими атрибутами dtype:
Символьный код (один из «biufcmMOSUV») идентифицирующий общий вид данных. | |
Уникальный символьный код для каждого из 21 встроенного типа. | |
Уникальное число для каждого из 21 встроенного типа. | |
Строка-тип протокола массива для этого объекта типа данных. |
Размер данных описывается:
Имя с битовой шириной для этого типа данных. | |
Размер элемента этого объекта типа данных. |
Порядок байтов этих данных:
Символ, указывающий порядок байтов для этого объекта типа данных. |
Информация о подтипах в структурированном типе данных:
Словарь именованных полей, определенных для этого типа данных, или | |
Упорядоченный список имён полей или |
Для типов данных, описывающих подмассивы:
Кортеж | |
Кортеж формы подмассива, если этот тип данных описывает подмассив, и |
Атрибуты, предоставляющие дополнительную информацию:
Булево значение, указывающее, содержит ли этот тип данных какие-либо объекты со ссылочным подсчётом в каких-либо полях или подтипах. | |
Флаги бит, описывающие, как интерпретировать этот тип данных. | |
Целое число, указывающее, как этот тип данных относится к встроенным типам данных. | |
Булево значение, указывающее, является ли порядок байтов этого типа данных родным для платформы. | |
| |
Требуемое выравнивание (байты) этого типа данных в соответствии с компилятором. | |
Возвращает тип данных для базового элемента подмассивов, независимо от их размерности или формы. |
Метаданные, добавленные пользователем:
Либо |
Методы
Типы данных имеют следующий метод для изменения порядка байтов:
| Возвращает новый тип данных с другим порядком байтов. |
Следующие методы реализуют протокол сериализации:
Вспомогательная функция для сериализации. | |
© 2005–2022 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/1.21/reference/arrays.dtypes.html