只是为了澄清,你可能知道这一点,但我认为最好确保:
- strides 元组的长度表示维数,所以
(1, )
和(8, )
都是一维的,(10, 2)
和(20, 1)
都是二维的。
- 对于 C 连续数组,strides 元组中的最后一个元素表示内存视图中项目的项目大小。这并不总是正确的:有时会填充值然后它会大于实际的项目大小 - 但在大多数情况下它代表项目大小。
因此,您不仅希望您的 memoryview 展平,而且应该展平并且项目大小为 1。
在 Python 3.3 中memoryview.cast
,添加了使数组展平变得微不足道的方法:
cast(format[, shape])
将内存视图转换为新格式或形状。shape 默认为 [byte_length//new_itemsize],这意味着结果视图将是一维的。返回值是一个新的内存视图,但缓冲区本身并没有被复制。支持的转换是 1D -> C-contiguous 和 C-contiguous -> 1D。
目标格式仅限于结构语法中的单元素本机格式。其中一种格式必须是字节格式(“B”、“b”或“c”)。结果的字节长度必须与原始长度相同。
所以它只有在你转换为 char ( c
)、unsigned char ( B
) 或 signed chars ( b
) 并且它是 C-contiguous 时才有效。
>>> import numpy as np
>>> memview = memoryview(np.ones((2, 3, 4)))
>>> memview.cast('b').strides # or 'B' or 'c'
(1, )
然而,这被展平并解释为 1 字节值。如果您只想将其展平,则需要再次将其转换为原始类型:
>>> memview.cast('b').cast(memview.format)
这将是一维的,但不会有大步,(1, )
因为浮点数是 8 个字节(至少如果它是float64
):
>>> memview.cast('b').cast(memview.format).strides
(8, )