yaforever
А что делает метод release() ?
memoryview() прицепляет к объекту объект для просмотра (и изменения) памяти, а release() - отцепляет.
Когда объект для просмотра памяти прицеплен, объект, который просматривается, может терять функциональность.
>>> a = bytearray(b'abcd')
>>> m = memoryview(a)
>>> m.tolist()
[97, 98, 99, 100]
>>>
>>> a.append(101)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
BufferError: Existing exports of data: object cannot be re-sized
>>>
>>> m.release()
>>> a.append(101)
>>> a
bytearray(b'abcde')
>>>
yaforever
И что такое shape?
shape - это размерность массива, то есть один и тот же массив элементов можно представить как одномерный, как двумерный, как трёхмерный и так далее.
>>> import array
>>>
>>> a = array.array('l', [1, 2, 3, 4])
>>> m = memoryview(a)
>>> m.tolist()
[1, 2, 3, 4]
>>>
>>> m.format, m.nbytes, m.shape
('l', 16, (4,))
>>>
>>> b = memoryview(m.tobytes())
>>>
>>> c = b.cast('l', shape=[4, 1])
>>> c.tolist()
[[1], [2], [3], [4]]
>>>
>>> c.format, c.nbytes, c.shape
('l', 16, (4, 1))
>>>
>>> c = b.cast('l', shape=[2, 2])
>>> c.tolist()
[[1, 2], [3, 4]]
>>>
>>> c.format, c.nbytes, c.shape
('l', 16, (2, 2))
>>>
>>> c = b.cast('l', shape=[1, 4])
>>> c.tolist()
[[1, 2, 3, 4]]
>>>
>>> c.format, c.nbytes, c.shape
('l', 16, (1, 4))
>>>
>>> a = array.array('l', [1, 2, 3, 4, 5, 6, 7, 8])
>>> m = memoryview(a)
>>> m.tolist()
[1, 2, 3, 4, 5, 6, 7, 8]
>>>
>>> c = memoryview(m.tobytes()).cast('l', shape=[2, 2, 2])
>>> c.tolist()
[[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
>>>
>>> c.format, c.nbytes, c.shape
('l', 32, (2, 2, 2))
>>>