如何转置Cython memoryview切片?三维数组切片转置报错求解
问题分析与解决方案
问题原因
虽然你检查arr3D[0]的suboffsets均为-1,但arr3D[0]本质是三维memoryview的子切片视图,而非原生的二维memoryview。Cython的memoryview转置逻辑中,这类从高维数组索引得到的子视图,会被判定为带有间接维度(即使表面内存布局连续),从而触发Cannot transpose memoryview with indirect dimensions错误。
可行解决方案
方案1:转为numpy数组后转置
先将子切片转为numpy数组,转置后再转回memoryview:
cdef int[:, ::1] slice_2D = arr3D[0] # 转置后转回memoryview cdef int[:, ::1] transposed_view = np.asarray(slice_2D).T
方案2:手动实现转置
直接通过内存访问完成转置,绕过memoryview的.T属性限制:
# 初始化转置后的二维memoryview cdef int[:, ::1] transposed = np.zeros((size_dim3, size_dim2), dtype=np.int32) cdef int i, j for i in range(size_dim2): for j in range(size_dim3): transposed[j, i] = arr3D[0, i, j]
方案3:使用cast转换为连续二维视图
通过cast方法将子切片转为标准连续二维memoryview,再执行转置:
cdef int[:, ::1] slice_2D = arr3D[0].cast("int[:, ::1]") # 此时转置正常 slice_2D.T
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

