memoryview 和 column-major / FORTRAN 缓冲区
memoryview and column-major / FORTRAN buffer
我有一个用于列优先数组的缓冲区(我通过 cffi
以字节形式获取它)。
有没有办法通过 Python 的缓冲协议的正确属性为其获取内存视图? cast
方法让我可以指定一个新的形状,但似乎没有让我指定视图是行优先还是列优先。
例如:
# Let b be my buffer of bytes for a column major array of integers
shape = (5, 2, 3)
mv = memoryview(b).cast('i', shape=shape)
# Expectedly not what I want as this is then assumed to be a
# C-style row-major array
mv.to_list()
如果不深入研究 C,确实没有简单的方法来更改 memoryview
的 strides/shape。最简单的方法是使用 NumPy(我在这里创建缓冲区,你应该跳过那行):
shape = (5, 2, 3)
b = bytearray('a' * np.dtype('i').itemsize * np.prod(shape))
a = np.frombuffer(b, dtype='i').reshape(shape)
a.strides = a.strides[::-1]
m = memoryview(a)
print(m.strides)
我有一个用于列优先数组的缓冲区(我通过 cffi
以字节形式获取它)。
有没有办法通过 Python 的缓冲协议的正确属性为其获取内存视图? cast
方法让我可以指定一个新的形状,但似乎没有让我指定视图是行优先还是列优先。
例如:
# Let b be my buffer of bytes for a column major array of integers
shape = (5, 2, 3)
mv = memoryview(b).cast('i', shape=shape)
# Expectedly not what I want as this is then assumed to be a
# C-style row-major array
mv.to_list()
如果不深入研究 C,确实没有简单的方法来更改 memoryview
的 strides/shape。最简单的方法是使用 NumPy(我在这里创建缓冲区,你应该跳过那行):
shape = (5, 2, 3)
b = bytearray('a' * np.dtype('i').itemsize * np.prod(shape))
a = np.frombuffer(b, dtype='i').reshape(shape)
a.strides = a.strides[::-1]
m = memoryview(a)
print(m.strides)