2013-11-21 15 views
5

Cho phép lấy mảng 3D làm ví dụ. Hoặc một khối lập phương để hình dung dễ dàng hơn.Mảng chọn (n-1) D từ mảng (n) D trong numpy

Tôi muốn chọn tất cả các khuôn mặt của hình khối đó. Và tôi muốn khái quát hóa điều này theo các chiều kích tùy ý.

Tôi cũng muốn sau đó thêm/xóa khuôn mặt vào khối lập phương (hình khối) và tổng quát thành thứ nguyên tùy ý.

Tôi biết rằng đối với mọi số thứ nguyên cố định bạn có thể làm array[:,:,0], array[-1,:,:] Tôi muốn biết cách khái quát hóa các thứ nguyên tùy ý và cách dễ dàng lặp lại trên tất cả các khuôn mặt.

+2

Ngoài câu trả lời Bas, một thành ngữ phổ biến trong 'numpy' tiếp cận với một trục tùy ý (ví dụ 'somefunc (somearray, axis = n)') là sử dụng 'swapaxes' để chuyển trục được chỉ định với trục đầu tiên trong mảng, và sau đó hoạt động trên trục đầu tiên của kết quả" hoán đổi ". 'swapaxes' tạo ra một khung nhìn, do đó không có bộ nhớ phụ nào được sử dụng. –

Trả lời

4

Để có được một khuôn mặt:

def get_face(M, dim, front_side): 
    if front_side: 
     side = 0 
    else: 
     side = -1 
    index = tuple(side if i == dim else slice(None) for i in range(M.ndim)) 
    return M[index] 

Để thêm một khuôn mặt (chưa được kiểm tra):

def add_face(M, new_face, dim, front_side): 
    #assume sizes match up correctly 
    if front_side: 
     return np.concatenate((new_face, M), dim) 
    else: 
     return np.concatenate((M, new_face), dim) 

Để loại bỏ một khuôn mặt:

def remove_face(M, dim, front_side): 
    if front_side: 
     dim_slice = slice(1, None) 
    else: 
     dim_slice = slice(None, -1) 
    index = tuple(dim_slice if i == dim else slice(None) for i in range(M.ndim)) 
    return M[index] 

lặp qua tất cả các khuôn mặt:

def iter_faces(M): 
    for dim in range(M.ndim): 
     for front_side in (True, False): 
      yield get_face(M, dim, front_side) 
.210

Một số xét nghiệm nhanh:

In [18]: M = np.arange(27).reshape((3,3,3)) 
In [19]: for face in iter_faces(M): print face 
[[0 1 2] 
[3 4 5] 
[6 7 8]] 
[[18 19 20] 
[21 22 23] 
[24 25 26]] 
[[ 0 1 2] 
[ 9 10 11] 
[18 19 20]] 
[[ 6 7 8] 
[15 16 17] 
[24 25 26]] 
[[ 0 3 6] 
[ 9 12 15] 
[18 21 24]] 
[[ 2 5 8] 
[11 14 17] 
[20 23 26]] 
+0

Cảm ơn, tôi cũng đã làm việc đó. – csiz

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