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

Lan*_*don 5 arrays matrix julia

我想弄清楚(在Julia中)当维度本身是一个变量时,如何沿着指定的维度提取数组的一部分.如果维度已知,则可以直接提取数组的一部分.例如,我可以通过执行以下操作来提取第3维的一部分:

A = rand(27,33,11)
A_portion = A[:,:,3:7]
Run Code Online (Sandbox Code Playgroud)

是否有一种紧凑/有效的方法来沿可变维度提取数组的一部分?例如,看起来像这样的东西?

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)
Run Code Online (Sandbox Code Playgroud)

一种可能性是为数组维度的每个可能组合(最多一些最大维数)和提取该部分的维度编写一组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
        ...
        ...
        ...
Run Code Online (Sandbox Code Playgroud)

显然,为了允许具有大量维度的阵列,这变得非常混乱.这样做有更紧凑/更有效的方法吗?

Jef*_*son 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
Run Code Online (Sandbox Code Playgroud)

第二个参数指定维度编号.在第一种情况下,我们在维度1中选择了索引2.在第二种情况下,我们在维度3中选择了索引1.

你也可以使用类似a[fill(:,2)...,1]"splats"两个:进入参数列表后跟a的方法来解决这个问题1.


beh*_*ger 6

Jeff Bezanson 的帖子是正确的,但该函数slicedim已重命名,请selectdim 参阅 julia github

\n\n
\njulia> a = rand(2,2,2)\n2\xc3\x972\xc3\x972 Array{Float64,3}:\n[:, :, 1] =\n 0.835392  0.645282\n 0.398793  0.774604\n\n[:, :, 2] =\n 0.00894267  0.191362\n 0.700798    0.897556\n\n\njulia> selectdim(a, 1, 2)\n2\xc3\x972 view(::Array{Float64,3}, 2, :, :) with eltype Float64:\n 0.398793  0.700798\n 0.774604  0.897556\n\n\njulia> selectdim(a, 3, 1)\n2\xc3\x972 view(::Array{Float64,3}, :, :, 1) with eltype Float64:\n 0.835392  0.645282\n 0.398793  0.774604\n\n
Run Code Online (Sandbox Code Playgroud)\n\n

(没有足够的声誉来发表评论)

\n