2016-08-29 20 views
5

Boyutun kendisi bir değişken olduğunda, bir dizinin belirli bir boyut boyunca bir kısmının nasıl çıkarılacağını (Julia'da) anlamaya çalışıyorum. Boyut biliniyorsa, bir dizinin bir bölümünü çıkarmak kolaylaşır.Julia: Belirtilen bir boyut boyunca bir dizinin bir kısmını nasıl ayıklamak

A = rand(27,33,11) 
A_portion = A[:,:,3:7] 

değişken boyut boyunca dizisinin bir kısmını çıkarmak için bir kompakt/etkili bir yöntem vardır: Örneğin, böyle bir şey yaparak 3 boyutu boyunca bir kısmını çıkarmak için? Örneğin, böyle görünen bir şey?

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) 

bir olanak kısmını çıkarmak için hangi boyunca ve boyut (bazı maksimum boyut sayısı kadar) dizi boyutunun her türlü kombinasyonu için ise-tabloların bir dizi yazmak. Örneğin, böyle bir şey:

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

Açıkçası bu boyutların çok sayıda Dizilerin için izin vermek için oldukça dağınık hale gelir. Bunu yapmak için daha kompakt/verimli bir yaklaşım var mı?

cevap

7

fonksiyonu slicedim yapar:

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 

İkinci argüman boyut sayısını belirtir. İlk durumda, 1. boyutta indeks 2'yi seçtik. İkinci durumda, boyut 3'te indeks 1'i seçtik.

Ayrıca, iki s "uyarısı" olan a[fill(:,2)...,1] gibi bir şey kullanarak yaklaşımları bir araya getirebilirsiniz. argüman listesi, ardından 1.

+1

Mükemmel. Bir dizi indeksi belirtmek bile mümkün gibi görünüyor: A_portion = dilimlenmiş (A, dim, first_element: last_element) ' – Landon

İlgili konular