You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何转置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 19:17:08