2016-08-29 32 views
5

我想弄清楚(在朱莉婭)如何提取指定的維度,當維度本身是一個變量的數組的一部分。如果維數已知,則可以直接提取數組的一部分。Julia:如何提取指定維度的數組的一部分

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 
     ... 
     ... 
     ... 

顯然,爲了允許具有大量維數的數組,這變得相當混亂。有沒有更緊湊/高效的方法來做到這一點?

回答

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在第二種情況下,我們在尺寸選擇的索引1 3.

也可以砍一起接近此使用類似a[fill(:,2)...,1]其中「層片」兩: s轉換參數列表後跟1

+1

非常好。它看起來甚至可以指定一系列索引:'A_portion = slicedim(A,dim,first_element:last_element)' – Landon

相關問題