Введение
Как упоминалось ранее, в NumPy существует несколько типов данных, и каждый тип данных представляет собой объект dtype (numpy.dtype). Сегодня мы подробно объясним объект dtype.
Определение dtype
Сначала посмотрите на определение метода dtype:
class numpy.dtype(obj, align=False, copy=False)
Его функция заключается в преобразовании объекта obj в объект типа dtype.
Он принимает два необязательных параметра:
-
align - выравнивать ли объекты в соответствии с форматом вывода структуры компилятора C.
-
Копировать — следует ли копировать объект или ссылку на объект.
dtype может использоваться для описания типа данных (int, float, объект Python и т. д.), описания размера данных, порядка байтов данных (с прямым порядком байтов или с прямым порядком байтов) и т. д.
объект, конвертируемый в dtype
Конвертируемые объекты obj могут иметь много типов, давайте объясним их по порядку.
объект dtype
Если объект obj сам является объектом dtype, возможно плавное преобразование.
None
Если не передано, по умолчаниюfloat_
, поэтому мы создаем массивы, которые по умолчанию имеют тип float.
скалярный тип массива
Встроенные скаляры массива могут быть преобразованы в связанные объекты типа данных.
В предыдущей статье мы говорили о том, что такое скалярный тип массива. Скалярные типы массивов — это типы данных, к которым можно получить доступ через np.type. Например:
np.int32
,np.complex128
Ждать.
Давайте посмотрим на преобразование скаляров массива:
In [85]: np.dtype(np.int32)
Out[85]: dtype('int32')
In [86]: np.dtype(np.complex128)
Out[86]: dtype('complex128')
Эти встроенные скалярные типы массивов, начинающиеся с np, можно найти в моей предыдущей статье «NumPy: типы данных».
Обратите внимание, что скаляры массива не являются объектами dtype, хотя во многих случаях скаляры массива могут использоваться везде, где требуются объекты dtype.
универсальный тип
Некоторые объекты универсального типа могут быть преобразованы в соответствующие типы dtype:
объект универсального типа | тип dtype |
---|---|
number , inexact , floating
|
float |
complexfloating |
cfloat |
integer , signedinteger
|
int_ |
unsignedinteger |
uint |
character |
string |
generic , flexible
|
void |
Встроенные типы Python
Некоторые встроенные типы Python эквивалентны скалярным типам массивов и также могут быть преобразованы в dtypes:
Тип Python | тип dtype |
---|---|
int | int_ |
bool | bool_ |
float | float_ |
complex | cfloat |
bytes | bytes_ |
str | str_ |
buffer | void |
(all others) | object_ |
Взгляните на пример встроенного преобразования типов Python:
In [82]: np.dtype(float)
Out[82]: dtype('float64')
In [83]: np.dtype(int)
Out[83]: dtype('int64')
In [84]: np.dtype(object)
Out[84]: dtype('O')
Объект со свойством .dtype
Объект любого типа, если он содержитdtype
Атрибут, и если этот атрибут принадлежит диапазону, который можно преобразовать, его можно преобразовать в dtype.
объект строки символов
Для каждого встроенного типа данных существует соответствующая кодировка символов, и мы также можем использовать эти кодировки символов для преобразования:
In [134]: np.dtype('b') # byte, native byte order
Out[134]: dtype('int8')
In [135]: np.dtype('>H') # big-endian unsigned short
Out[135]: dtype('>u2')
In [136]: np.dtype('<f') # little-endian single-precision float
Out[136]: dtype('float32')
In [137]: np.dtype('d') # double-precision floating-point number
Out[137]: dtype('float64')
Массив строкового типа
Объекты типа массива в Numpy имеют свойство, называемоеtypestr.
typestr описывает тип и длину данных, хранящихся в этом массиве.
typestr состоит из трех частей, первая часть описывает порядок байтов данных:<
прямой порядок байтов>
большой порядок байтов.
Вторая часть — это базовый тип элементов массива:
тип | описывать |
---|---|
t |
Bit field (following integer gives the number of bits in the bit field). |
b |
Boolean (integer type where all values are only True or False) |
i |
Integer |
u |
Unsigned integer |
f |
Floating point |
c |
Complex floating point |
m |
Timedelta |
M |
Datetime |
O |
Object (i.e. the memory contains a pointer to PyObject) |
S |
String (fixed-length sequence of char) |
U |
Unicode (fixed-length sequence of Py_UNICODE) |
V |
Другое (void * — каждый элемент представляет собой фрагмент памяти фиксированного размера) |
Последняя часть — это длина данных.
dtype поддерживает следующие типы преобразований:
тип | описывать |
---|---|
'?' |
boolean |
'b' |
(signed) byte |
'B' |
unsigned byte |
'i' |
(signed) integer |
'u' |
unsigned integer |
'f' |
floating-point |
'c' |
complex-floating point |
'm' |
timedelta |
'M' |
datetime |
'O' |
(Python) objects |
'S' , 'a'
|
zero-terminated bytes (not recommended) |
'U' |
Unicode string |
'V' |
raw data (void ) |
Давайте рассмотрим несколько примеров:
In [137]: np.dtype('d')
Out[137]: dtype('float64')
In [138]: np.dtype('i4')
Out[138]: dtype('int32')
In [139]: np.dtype('f8')
Out[139]: dtype('float64')
In [140]: np.dtype('c16')
Out[140]: dtype('complex128')
In [141]: np.dtype('a25')
Out[141]: dtype('S25')
In [142]: np.dtype('U25')
Out[142]: dtype('<U25')
строка, разделенная запятыми
Строка, разделенная запятыми, может использоваться для представления структурированных типов данных.
Этот структурированный тип данных также может быть преобразован в формат dtpye.Преобразованный тип dtype будет использовать f1, f2, ... fn-1 в качестве имени для сохранения данных соответствующего формата. Возьмем пример:
In [143]: np.dtype("i4, (2,3)f8, f4")
Out[143]: dtype([('f0', '<i4'), ('f1', '<f8', (2, 3)), ('f2', '<f4')])
В приведенном выше примере f0 содержит 32-битное целое число, а f1 содержит массив 2 x 3 64-битных чисел с плавающей запятой. f2 — 32-битное число с плавающей запятой.
Давайте посмотрим на другой пример:
In [144]: np.dtype("a3, 3u8, (3,4)a10")
Out[144]: dtype([('f0', 'S3'), ('f1', '<u8', (3,)), ('f2', 'S10', (3, 4))])
введите строку
все вnumpy.sctypeDict
Все символы в .keys() можно преобразовать в dtype:
In [146]: np.sctypeDict.keys()
Out[146]: dict_keys(['?', 0, 'byte', 'b', 1, 'ubyte', 'B', 2, 'short', 'h', 3, 'ushort', 'H', 4, 'i', 5, 'uint', 'I', 6, 'intp', 'p', 7, 'uintp', 'P', 8, 'long', 'l', 'L', 'longlong', 'q', 9, 'ulonglong', 'Q', 10, 'half', 'e', 23, 'f', 11, 'double', 'd', 12, 'longdouble', 'g', 13, 'cfloat', 'F', 14, 'cdouble', 'D', 15, 'clongdouble', 'G', 16, 'O', 17, 'S', 18, 'unicode', 'U', 19, 'void', 'V', 20, 'M', 21, 'm', 22, 'bool8', 'Bool', 'b1', 'float16', 'Float16', 'f2', 'float32', 'Float32', 'f4', 'float64', 'Float64', 'f8', 'float128', 'Float128', 'f16', 'complex64', 'Complex32', 'c8', 'complex128', 'Complex64', 'c16', 'complex256', 'Complex128', 'c32', 'object0', 'Object0', 'bytes0', 'Bytes0', 'str0', 'Str0', 'void0', 'Void0', 'datetime64', 'Datetime64', 'M8', 'timedelta64', 'Timedelta64', 'm8', 'int64', 'uint64', 'Int64', 'UInt64', 'i8', 'u8', 'int32', 'uint32', 'Int32', 'UInt32', 'i4', 'u4', 'int16', 'uint16', 'Int16', 'UInt16', 'i2', 'u2', 'int8', 'uint8', 'Int8', 'UInt8', 'i1', 'u1', 'complex_', 'int0', 'uint0', 'single', 'csingle', 'singlecomplex', 'float_', 'intc', 'uintc', 'int_', 'longfloat', 'clongfloat', 'longcomplex', 'bool_', 'unicode_', 'object_', 'bytes_', 'str_', 'string_', 'int', 'float', 'complex', 'bool', 'object', 'str', 'bytes', 'a'])
Пример использования:
In [147]: np.dtype('uint32')
Out[147]: dtype('uint32')
In [148]: np.dtype('float64')
Out[148]: dtype('float64')
кортеж
Используя кортежи dtypes, мы можем генерировать новые dtypes.
Кортежи также бывают разными.
(flexible_dtype, itemsize)
Для dtypes переменной длины может быть указан размер:
In [149]: np.dtype((np.void, 10))
Out[149]: dtype('V10')
In [150]: np.dtype(('U', 10))
Out[150]: dtype('<U10')
(fixed_dtype, shape)
Для dtypes фиксированной длины форма может быть указана:
In [151]: np.dtype((np.int32, (2,2)))
Out[151]: dtype(('<i4', (2, 2)))
In [152]: np.dtype(('i4, (2,3)f8, f4', (2,3)))
Out[152]: dtype(([('f0', '<i4'), ('f1', '<f8', (2, 3)), ('f2', '<f4')], (2, 3)))
[(field_name, field_dtype, field_shape), ...]
Элементы в списке — это поля, расположенные один за другим, и каждое поле состоит из 2–3 частей: имени поля, типа поля и формы поля.
field_nameЕсли это ' ', он будет использовать по умолчанию f1, f2 .... в качестве имени.field_nameТакже может быть 2-кортежем, состоящим из заголовка и имени.
field_dtypeЭто тип dtype поля.
shape является необязательным полем, еслиfield_dtypeЕсли это массив, вам нужно указать форму.
In [153]: np.dtype([('big', '>i4'), ('little', '<i4')])
Out[153]: dtype([('big', '>i4'), ('little', '<i4')])
Выше приведены два поля: одно — 32-битное целое с обратным порядком байтов, а другое — 32-битное целое с прямым порядком байтов.
In [154]: np.dtype([('R','u1'), ('G','u1'), ('B','u1'), ('A','u1')])
Out[154]: dtype([('R', 'u1'), ('G', 'u1'), ('B', 'u1'), ('A', 'u1')])
Четыре поля, каждое из которых представляет собой целое число без знака.
{'names': ..., 'formats': ..., 'offsets': ..., 'titles': ..., 'itemsize': ...}
Эта нотация может указывать список имен и список форматов:
In [157]: np.dtype({'names': ['r','g','b','a'], 'formats': [np.uint8, np.uint8, np.uint8, np.uint8]})
Out[157]: dtype([('r', 'u1'), ('g', 'u1'), ('b', 'u1'), ('a', 'u1')])
offsetsОтносится к смещению в байтах каждого поля. titles — название поля,itemsizeэто размер всего dtype.
In [158]: np.dtype({'names': ['r','b'], 'formats': ['u1', 'u1'],
...: 'offsets': [0, 2],
...: 'titles': ['Red pixel', 'Blue pixel']})
...:
Out[158]: dtype({'names':['r','b'], 'formats':['u1','u1'], 'offsets':[0,2], 'titles':['Red pixel','Blue pixel'], 'itemsize':3})
(base_dtype, new_dtype)
Базовые типы dtype могут быть преобразованы в структурированные типы dtype:
In [159]: np.dtype((np.int32,{'real':(np.int16, 0),'imag':(np.int16, 2)}))
Out[159]: dtype([('real', '<i2'), ('imag', '<i2')])
32-разрядное целое число преобразуется в два 16-разрядных целых числа.
In [161]: np.dtype(('i4', [('r','u1'),('g','u1'),('b','u1'),('a','u1')]))
Out[161]: dtype([('r', 'u1'), ('g', 'u1'), ('b', 'u1'), ('a', 'u1')])
32-битное целое число, преобразованное в 4 целых числа без знака.
Эта статья была включена вwoohoo.floydpress.com/04-python-вы…
Самая популярная интерпретация, самая глубокая галантерея, самые краткие уроки и множество трюков, о которых вы не знаете, ждут вас!
Добро пожаловать, чтобы обратить внимание на мой официальный аккаунт: «Программируйте эти вещи», разбирайтесь в технологиях, лучше поймите себя!