Julia:如何沿指定维度提取数组的一部分

时间:2016-08-29 22:41:21

标签: arrays matrix julia

我试图找出(在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
        ...
        ...
        ...

显然,为了允许具有大量维度的数组,这变得非常混乱。这样做是否有更紧凑/更有效的方法?

2 个答案:

答案 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

(声誉欠佳,无法发表评论)