如何在julia中指定数组的第i轴
如何使用for循环简化代码 eta和T是6阶张量数组,sizeeta==sizeT如何在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 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]在这里被多次覆盖,因此结果取决于操作顺序,而不仅仅取决于数据数组