2016-08-29 2 views
5

Я пытаюсь выяснить (в Юлии), как извлечь часть массива по указанному размеру, когда сами измерения являются переменной. Если размерность известна, легко извлечь часть массива. Например, я могу извлечь часть вдоль 3-го измерения, делая что-то вроде этого: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 

Второй аргумент указывает номер измерения. В первом случае мы выбрали индекс 2 в размерности 1. Во втором случае мы выбрали индекс 1 в размерности 3.

Вы также можете взломать подходы к этому, используя что-то вроде a[fill(:,2)...,1], которое «отображает» два : s в список аргументов, за которым следует 1.

+1

Отлично. Похоже, что даже можно указать диапазон индексов: 'A_portion = slicedim (A, dim, first_element: last_element)' – Landon

Смежные вопросы