有没有一种纯Python的方法可以转置 memoryview
?
Python中的memoryview
不仅仅可以表示一维字节块,还可以表示多维布局、非连续内存、复杂元素类型等等。例如,在下面的代码中:
In [1]: import numpy
In [2]: x = numpy.array([[1, 2], [3, 4]])
In [3]: y = x.T
In [4]: a = memoryview(x)
In [5]: b = memoryview(y)
a
和 b
是两个 2x2 的多维内存视图:
In [6]: a.shape
Out[6]: (2, 2)
In [7]: b.shape
Out[7]: (2, 2)
b
代表a
的转置,因此a[i, j]
和b[j, i]
别名引用相同的内存(即原始x
数组的第i行第j列):
In [8]: a[0, 1] = 5
In [9]: b[1, 0]
Out[9]: 5
In [10]: x
Out[10]:
array([[1, 5],
[3, 4]])
NumPy数组支持简单的转置操作,但是NumPy数组并不是仅有的多维内存视图来源。例如,您可以将单维度内存视图转换为多维度内存视图:
In [11]: bytearr = bytearray([1, 2, 3, 4])
In [12]: mem = memoryview(bytearr).cast('b', (2, 2))
In [13]: mem.shape
Out[13]: (2, 2)
In [14]: mem[1, 0] = 5
In [15]: bytearr
Out[15]: bytearray(b'\x01\x02\x05\x04')
memoryview的格式足够灵活,可以表示与mem
倒置的格式,就像我们之前示例中a
对应的b
一样。但是,在memoryview API中似乎没有易于倒置的方法。是否有一种纯Python的方式可以倒置任意多维memoryviews?
memoryview
的对象是_什么_?为什么无论它是什么,用“正常”的方法转置都不起作用呢? - martineaumemoryview
可以有形状(即可以是多维的),并且可以访问内存。这就是NumPy数组的memoryview
工作原理。参考链接:https://docs.python.org/zh-cn/3/library/stdtypes.html#memoryview.shape - jakirkhamnumpy
,都是使用一块连续分配的内存来实现的... - juanpa.arrivillagamemoryview(bytearray(b'asdf')).cast('b', (2, 2))
的方式,创建一个由bytearray
支持的多维memoryview
。虽然bytearray
是一维的,但仍然可以对memoryview
进行转置。 - user2357112