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

如何优雅实现Julia中Array{T,N}到Array{Array{T,M},N-M}的转换

方案1:高版本Julia直接用eachslice

Julia 1.7及以上版本的eachslice已经支持指定多维度作为外层数组的轴,直接一行代码就能实现需求:

y = collect(eachslice(x, dims = (1, 3)))

这里dims=(1,3)表示外层数组保留原数组的第1、3维,剩下的第2维自动打包为内层的一维数组,运行结果和要求的结构完全一致。

方案2:列表推导(全版本兼容,最易调整)

如果需要兼容低版本Julia,或者需要灵活自定义切片逻辑,用列表推导是最直观的选择:

y = [x[i, :, k] for i in axes(x, 1), k in axes(x, 3)]

需要适配不同形状的数组时,只要修改推导式里的遍历轴和索引规则即可,不需要处理广播的轴重塑逻辑,可读性远高于广播getindex方案。

方案3:通用封装函数

如果需要频繁对不同维度的数组做这类操作,可以封装一个通用函数,指定要保留为外层的维度即可:

function slice_to_outer(arr, outer_dims::Tuple{Vararg{Int}})
    n_outer = length(outer_dims)
    outer_size = ntuple(i -> size(arr, outer_dims[i]), n_outer)
    res = similar(arr, Vector{eltype(arr)}, outer_size)
    # 生成外层笛卡尔索引
    for I in CartesianIndices(outer_size)
        idx = fill(:, ndims(arr))
        for (i, d) in enumerate(outer_dims)
            idx[d] = I[i]
        end
        res[I] = vec(arr[idx...])
    end
    return res
end

# 调用示例
y = slice_to_outer(x, (1, 3))

这个函数支持任意维度的输入数组,只要传入要保留为外层的维度元组即可自动生成目标结构。

内容的提问来源于stack exchange,提问作者BatWannaBe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 17:09:02