我试图找出(在Julia中)当维度本身是变量时如何沿指定维度提取数组的一部分。如果维度已知,则可以直接提取数组的一部分。例如,我可以通过执行以下操作来提取第3维的一部分:
A = rand(27,33,11)
A_portion = A[:,:,3:7]
是否有一种紧凑/有效的方法来沿可变维度提取数组的一部分?例如,看起来像这样的东西?
A = rand(27,33,11)
dim = 3 ## dimension along which to grab a portion of the array
first_element = 3 ## first element over specified dimension
last_element = 7 ## last element over specified dimension
A_portion = MyFunction(A,dim,first_sample,last_sample)
一种可能性是为每个可能的数组维度组合(最多一些最大维数)和提取该部分的维度编写一组if语句。例如,像这样:
MyFunction(A::Array,dim::Int,first_element::Int,last_element::Int)
if ndims(A)==1 && dim==1
return A[first_element:last_element]
elseif ndims(A)==2 && dim==1
return A[first_element:last_element,:]
elseif ndims(A)==2 && dim==2
return A[:,first_element:last_element]
elseif ndims(A)==3 && dim==1
...
...
...
显然,为了允许具有大量维度的数组,这变得非常混乱。这样做是否有更紧凑/更有效的方法?
答案 0 :(得分:7)
函数slicedim
执行此操作:
julia> a = rand(2,2,2)
2×2×2 Array{Float64,3}:
[:, :, 1] =
0.754584 0.133549
0.363346 0.731388
[:, :, 2] =
0.415001 0.907887
0.301889 0.763312
julia> slicedim(a, 1, 2)
2×2 Array{Float64,2}:
0.363346 0.301889
0.731388 0.763312
julia> slicedim(a, 3, 1)
2×2 Array{Float64,2}:
0.754584 0.133549
0.363346 0.731388
第二个参数指定维度编号。在第一种情况下,我们在维度1中选择了索引2.在第二种情况下,我们在维度3中选择了索引1.
你也可以使用诸如a[fill(:,2)...,1]
之类的东西来解决这个问题。" splats"两个:
进入参数列表,后跟1
。
答案 1 :(得分:1)
Jeff Bezanson的帖子是正确的,但是功能slicedim
重命名为selectdim
see julia github
julia> a = rand(2,2,2)
2×2×2 Array{Float64,3}:
[:, :, 1] =
0.835392 0.645282
0.398793 0.774604
[:, :, 2] =
0.00894267 0.191362
0.700798 0.897556
julia> selectdim(a, 1, 2)
2×2 view(::Array{Float64,3}, 2, :, :) with eltype Float64:
0.398793 0.700798
0.774604 0.897556
julia> selectdim(a, 3, 1)
2×2 view(::Array{Float64,3}, :, :, 1) with eltype Float64:
0.835392 0.645282
0.398793 0.774604
(声誉欠佳,无法发表评论)