2016-08-29 25 views
5

Tôi đang cố gắng tìm ra (trong Julia) làm thế nào để trích xuất một phần của một mảng dọc theo một chiều nhất định, khi kích thước chính nó là một biến. Nếu kích thước được biết thì đơn giản là trích xuất một phần của mảng. Ví dụ, tôi có thể trích xuất một phần dọc theo chiều thứ 3 bằng cách làm một cái gì đó như thế này:Julia: Làm thế nào để trích xuất một phần của một mảng dọc theo một chiều xác định

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

Có/phương pháp hiệu quả nhỏ gọn để trích xuất một phần của một mảng dọc theo một chiều hướng biến? Ví dụ, một cái gì đó trông như thế này?

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) 

Một khả năng là viết một tập hợp các câu lệnh nếu có thể kết hợp kích thước mảng (tối đa một số kích thước tối đa) và thứ nguyên để trích xuất phần. Ví dụ: một cái gì đó như thế này:

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

Rõ ràng điều này trở nên khá lộn xộn để cho phép các mảng có số lượng lớn kích thước. Có cách tiếp cận nhỏ gọn/hiệu quả hơn để thực hiện việc này không?

Trả lời

7

Chức năng slicedim thực hiện điều này:

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 

Đối số thứ hai xác định số kích thước. Trong trường hợp đầu tiên, chúng tôi đã chọn chỉ số 2 trong thứ nguyên 1. Trong trường hợp thứ hai, chúng tôi đã chọn chỉ mục 1 trong thứ nguyên 3.

Bạn cũng có thể hack cùng nhau bằng cách sử dụng một cái gì đó như a[fill(:,2)...,1] "splats" hai : s danh sách đối số theo sau là 1.

+1

Tuyệt vời. Có vẻ như nó thậm chí có thể chỉ định một loạt các chỉ số: 'A_portion = slicedim (A, mờ, first_element: last_element)' – Landon

Các vấn đề liên quan