gpt4 book ai didi

julia - 如何在julia中指定数组的第i轴

转载 作者:行者123 更新时间:2023-12-02 02:24:44 24 4
gpt4 key购买 nike

如何使用 for 循环简化代码?

etaT 是 6 阶张量数组,并且 size(eta) == size(T)

using  InvertedIndices
one_to_N = [1:6;]
eta[:,1,1,1,1,1] = vec(sum(T, dims=one_to_N[Not(1)]))
eta[1,:,1,1,1,1] = vec(sum(T, dims=one_to_N[Not(2)]))
eta[1,1,:,1,1,1] = vec(sum(T, dims=one_to_N[Not(3)]))
eta[1,1,1,:,1,1] = vec(sum(T, dims=one_to_N[Not(4)]))
eta[1,1,1,1,:,1] = vec(sum(T, dims=one_to_N[Not(5)]))
eta[1,1,1,1,1,:] = vec(sum(T, dims=one_to_N[Not(6)]))

最佳答案

您也可以直接使用 sum! 编写,而不是创建总和然后将其复制到 eta 中。使用索引 1:1 而不是 1 制作 View 意味着这些维度不会被删除,因此 sum! 可以推断出要对哪些维度求和:

data = rand(Int8, 4,7,2);  # originally T, with ndims(T)==6, reduced for clarity
eta = ones(4,7,2);

for dim in 1:ndims(data)
ind = ntuple(d -> d==dim ? (:) : (1:1), ndims(data))
sum!(view(eta, ind...), data)
end

这给出:

julia> eta
4×7×2 Array{Float64, 3}:
[:, :, 1] =
-1.0 -29.0 -581.0 118.0 -106.0 189.0 198.0
-100.0 1.0 1.0 1.0 1.0 1.0 1.0
468.0 1.0 1.0 1.0 1.0 1.0 1.0
-214.0 1.0 1.0 1.0 1.0 1.0 1.0

[:, :, 2] =
-130.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0

julia> dim = 2;

julia> ind = ntuple(d -> d==dim ? (:) : (1:1), ndims(data))
(1:1, Colon(), 1:1)

julia> view(eta, ind...)
1×7×1 view(::Array{Float64, 3}, 1:1, :, 1:1) with eltype Float64:
[:, :, 1] =
-1.0 -29.0 -581.0 118.0 -106.0 189.0 198.0

julia> sum(data, dims=(1,3))
1×7×1 Array{Int64, 3}:
[:, :, 1] =
80 -29 -581 118 -106 189 198

请注意,eta[1] 在这里被覆盖了几次,因此结果取决于操作的顺序,而不仅仅是取决于 data 数组。

关于julia - 如何在julia中指定数组的第i轴,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65866612/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com