2015-07-28 17 views
6

Có cách nào để phân vùng và định hình lại mảng 2D thành mảng 3D không. Giống như ví dụ sau:Numpy - Định hình lại và phân vùng Mảng 2D thành 3D

enter image description here

Về cơ bản, tôi có một ma trận 4x4 bên trái và tôi muốn có một ma trận 2x2x4 trong cách thể hiện, vì vậy mà tôi có thể áp dụng numpy.mean trên trục thứ 3. Trong thực tế ma trận tôi có thực sự là rất lớn, vì vậy đó là lý do tại sao lặp qua các khối không phải là một lựa chọn.

Bất kỳ trợ giúp nào được đánh giá cao.

+3

Liên quan: http://stackoverflow.com/q/16856788/190597 – unutbu

+0

Cảm ơn bạn. Áp dụng giá trị trung bình hai lần trên trục 1 với phương thức trên trang đó đã thực hiện thủ thuật. – Auxiliary

+1

Một phiên bản liên quan khác để đặt các khối đó thành các cột - http://stackoverflow.com/questions/30109068/implement-matlabs-im2col-sliding-in-python. Làm cho nó dễ dàng hơn để bất kỳ hoạt động bạn có thể muốn có chúng theo chiều ngược lại một cách vectorized bằng cách hoạt động dọc theo trục thứ 0 sau này. – Divakar

Trả lời

2

Ví dụ: bạn có thể sử dụng numpy.lib.stride_tricks.as_strided.

In [1]: A = np.arange(16).reshape(4, 4) 

In [2]: A 
Out[2]: 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11], 
     [12, 13, 14, 15]]) 

In [3]: strides = A.itemsize * np.array([8, 2, 4, 1]) 

In [4]: x = p.lib.stride_tricks.as_strided(A, shape = (2, 2, 2, 2), strides = strides) 

In [4]: x 
Out[4]: 
array([[[[ 0, 1], 
     [ 4, 5]], 

     [[ 2, 3], 
     [ 6, 7]]], 


     [[[ 4, 5], 
     [ 8, 9]], 

     [[ 6, 7], 
     [10, 11]]]]) 

In [5]: x.reshape(4, 2, 2) 
Out[5]: 
array([[[ 0, 1], 
     [ 4, 5]], 

     [[ 2, 3], 
     [ 6, 7]], 

     [[ 8, 9], 
     [12, 13]], 

     [[10, 11], 
     [14, 15]]]) 

Các bước tiến xác định offsets trong byte để sử dụng khi đi qua mảng, và as_strided chức năng cho phép bạn xây dựng một mảng mới với người dùng xác định những bước tiến.

Tuy nhiên, tôi không biết nó hiệu quả như thế nào và nó sẽ mở rộng như thế nào cho việc sử dụng của bạn.

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