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

如何在julia中指定数组的第i轴,julia,Julia,如何使用for循环简化代码 eta和T是6阶张量数组,sizeeta==sizeT 有很多方法可以做到这一点。下面是一些很快就会浮现在脑海中的: 您可以这样做: for i in 1:6 eta[ifelse.(1:6 .== i, :, 1)...] = vec(sum(T, dims=one_to_N[Not(i)])) end for i in 1:6 eta[ntuple(j -> j == i ? (:) : 1, 6)...] = vec(sum(T, dim

如何使用for循环简化代码

eta和T是6阶张量数组,sizeeta==sizeT


有很多方法可以做到这一点。下面是一些很快就会浮现在脑海中的:

您可以这样做:

for i in 1:6
    eta[ifelse.(1:6 .== i, :, 1)...] = vec(sum(T, dims=one_to_N[Not(i)]))
end
for i in 1:6
    eta[ntuple(j -> j == i ? (:) : 1, 6)...] = vec(sum(T, dims=one_to_N[Not(i)]))
end
for i in 1:6
    eta[(j == i ? (:) : 1 for j in 1:6)...] = vec(sum(T, dims=one_to_N[Not(i)]))
end
或者像这样:

for i in 1:6
    eta[ifelse.(1:6 .== i, :, 1)...] = vec(sum(T, dims=one_to_N[Not(i)]))
end
for i in 1:6
    eta[ntuple(j -> j == i ? (:) : 1, 6)...] = vec(sum(T, dims=one_to_N[Not(i)]))
end
for i in 1:6
    eta[(j == i ? (:) : 1 for j in 1:6)...] = vec(sum(T, dims=one_to_N[Not(i)]))
end
或者像这样:

for i in 1:6
    eta[ifelse.(1:6 .== i, :, 1)...] = vec(sum(T, dims=one_to_N[Not(i)]))
end
for i in 1:6
    eta[ntuple(j -> j == i ? (:) : 1, 6)...] = vec(sum(T, dims=one_to_N[Not(i)]))
end
for i in 1:6
    eta[(j == i ? (:) : 1 for j in 1:6)...] = vec(sum(T, dims=one_to_N[Not(i)]))
end

有很多方法可以做到这一点。下面是一些很快就会浮现在脑海中的:

您可以这样做:

for i in 1:6
    eta[ifelse.(1:6 .== i, :, 1)...] = vec(sum(T, dims=one_to_N[Not(i)]))
end
for i in 1:6
    eta[ntuple(j -> j == i ? (:) : 1, 6)...] = vec(sum(T, dims=one_to_N[Not(i)]))
end
for i in 1:6
    eta[(j == i ? (:) : 1 for j in 1:6)...] = vec(sum(T, dims=one_to_N[Not(i)]))
end
或者像这样:

for i in 1:6
    eta[ifelse.(1:6 .== i, :, 1)...] = vec(sum(T, dims=one_to_N[Not(i)]))
end
for i in 1:6
    eta[ntuple(j -> j == i ? (:) : 1, 6)...] = vec(sum(T, dims=one_to_N[Not(i)]))
end
for i in 1:6
    eta[(j == i ? (:) : 1 for j in 1:6)...] = vec(sum(T, dims=one_to_N[Not(i)]))
end
或者像这样:

for i in 1:6
    eta[ifelse.(1:6 .== i, :, 1)...] = vec(sum(T, dims=one_to_N[Not(i)]))
end
for i in 1:6
    eta[ntuple(j -> j == i ? (:) : 1, 6)...] = vec(sum(T, dims=one_to_N[Not(i)]))
end
for i in 1:6
    eta[(j == i ? (:) : 1 for j in 1:6)...] = vec(sum(T, dims=one_to_N[Not(i)]))
end

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

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]在此处被多次覆盖,因此结果取决于操作的顺序,而不仅仅取决于数据数组。

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

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]在这里被多次覆盖,因此结果取决于操作顺序,而不仅仅取决于数据数组