Сообщить об ошибке.

Метод memoryview.cast() в Python, примеры кода

Новое представление памяти

Синтаксис:

memoryview.cast(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]]