如何优雅实现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
相关产品推荐
相关产品推荐

