memoryview.cast(format[, shape])
memoryview
- объект памяти буфера обменаformat
- shape
- Метод memoryview.cast()
приведет memoryview
к новому формату format
или форме shape
.
Форма shape
по умолчанию имеет значение [byte_length//new_item size]
, это означает, что результирующий вид будет одномерным. Возвращаемое значение - это новое представление памяти, но сам буфер не копируется. Поддерживаемые слепки 1D -> C-contiguous
и C-contiguous -> 1D
.
Буфер считается смежным-contiguous
в точности, если он является либо С
-смежным, либо смежным с языком Фортран.
Конечный формат ограничен одним собственным форматом элемента в синтаксисе модуля struct. Один из форматов должен быть байтовым (‘B’
, ‘b’
или ‘c’
). Длина байта результата должна быть такой же, как и исходная длина.
Приведение 1D/long
к 1D/unsigned
bytes:
>>> import array >>> a = array.array('l', [1,2,3]) >>> x = memoryview(a) >>> x.format # 'l' >>> x.itemsize # 8 >>> len(x) # 3 >>> x.nbytes # 24 >>> y = x.cast('B') >>> y.format # 'B' >>> y.itemsize # 1 >>> len(y) # 24 >>> y.nbytes # 24
Приведение 1D/unsigned
bytes к 1D/char
:
>>> b = bytearray(b'zyz') >>> x = memoryview(b) >>> x[0] = b'a' # Traceback (most recent call last): # File "<stdin>", line 1, in <module> # ValueError: memoryview: invalid value for format "B" >>> y = x.cast('c') >>> y[0] = b'a' >>> b # bytearray(b'ayz')
Приведение 1D/bytes
к 3D/ints
к 1D/signed
char:
>>> import struct >>> buf = struct.pack("i"*12, *list(range(12))) >>> x = memoryview(buf) >>> y = x.cast('i', shape=[2,2,3]) >>> y.tolist() # [[[0, 1, 2], [3, 4, 5]], [[6, 7, 8], [9, 10, 11]]] >>> y.format # 'i' >>> y.itemsize # 4 >>> len(y) # 2 >>> y.nbytes # 48 >>> z = y.cast('b') >>> z.format # 'b' >>> z.itemsize # 1 >>> len(z) # 48 >>> z.nbytes # 48
Приведение 1D/unsigned
long к 2D/unsigned
long:
>>> buf = struct.pack("L"*6, *list(range(6))) >>> x = memoryview(buf) >>> y = x.cast('L', shape=[2,3]) >>> len(y) # 2 >>> y.nbytes # 48 >>> y.tolist() # [[0, 1, 2], [3, 4, 5]]