2012-05-21 31 views
8

Nếu tôi có một mảng như thế này:Giảm độ phân giải của mảng thông qua tổng

a = np.array([[ 1, 2, 3, 4], 
       [ 5 ,6, 7, 8], 
       [ 9,10,11,12], 
       [13,14,15,16]]) 

Tôi muốn 'thay đổi độ phân giải', và kết thúc với một mảng nhỏ hơn, (nói 2 hàng bởi 2 màu sắc, hoặc 2 hàng bởi 4 cols, v.v.). Tôi muốn thay đổi độ phân giải này xảy ra thông qua tổng kết. Tôi cần điều này để làm việc với mảng lớn, số lượng hàng, cols của mảng nhỏ hơn sẽ luôn là một yếu tố của mảng lớn hơn.

Giảm mảng trên để 2 của 2 mảng sẽ cho kết quả (đó là những gì tôi muốn):

[[ 14. 22.] 
[ 46. 54.]] 

tôi có chức năng này mà hiện nó tốt:

import numpy as np 

def shrink(data, rows, cols): 
    shrunk = np.zeros((rows,cols)) 
    for i in xrange(0,rows): 
     for j in xrange(0,cols): 
      row_sp = data.shape[0]/rows 
      col_sp = data.shape[1]/cols 
      zz = data[i*row_sp : i*row_sp + row_sp, j*col_sp : j*col_sp + col_sp] 
      shrunk[i,j] = np.sum(zz) 
    return shrunk 

print shrink(a,2,2) 
print shrink(a,2,1) 
#correct output: 
[[ 14. 22.] 
[ 46. 54.]] 
[[ 36.] 
[ 100.]] 

tôi đã có một cái nhìn dài qua các examples, nhưng dường như không thể tìm thấy bất cứ điều gì giúp.

Có cách nào nhanh hơn để thực hiện việc này mà không cần các vòng lặp không?

+0

Nếu nó hoạt động tốt, câu hỏi của bạn là gì? –

+0

@Niek de Klein - chỉnh sửa để làm rõ. Tôi là một phương pháp nhanh hơn để làm điều này. – fraxel

+0

Những người muốn làm loại công cụ này có khuynh hướng sử dụng mô-đun 'itertools', có thể đáng xem. – heltonbiker

Trả lời

21

Với ví dụ của bạn:

a.reshape(2,2,2,2).sum(axis=1).sum(axis=2) 

lợi nhuận:

array([[14, 22], 
     [46, 54]]) 

Bây giờ chúng ta hãy tạo một hàm tổng quát ...

def shrink(data, rows, cols): 
    return data.reshape(rows, data.shape[0]/rows, cols, data.shape[1]/cols).sum(axis=1).sum(axis=2) 

công trình cho các ví dụ của bạn:

In [19]: shrink(a, 2,2) 
Out[19]: 
array([[14, 22], 
     [46, 54]]) 

In [20]: shrink(a, 2,1) 
Out[20]: 
array([[ 36], 
     [100]]) 
+0

Điều này thật đáng kinh ngạc "Numpythonic". – heltonbiker

+0

(+1) Thông minh! ... – NPE

+0

Chính xác những gì tôi đang tìm kiếm cảm ơn! – fraxel

3

tôi chắc chắn rằng có một/cách tiếp cận thông minh tốt hơn mà không cần tất cả những vòng khủng khiếp ...

Dưới đây là một cách để tránh một cách rõ ràng Looping trên mọi phần tử của data:

def shrink(data, rows, cols): 
    row_sp = a.shape[0]/rows 
    col_sp = a.shape[1]/cols 
    tmp = np.sum(data[i::row_sp] for i in xrange(row_sp)) 
    return np.sum(tmp[:,i::col_sp] for i in xrange(col_sp)) 

Trên máy của tôi, tốc độ này nhanh hơn khoảng 30% so với phiên bản của bạn (cho shrink(a, 2, 2)).

+0

+1 cảm ơn rất nhiều, cách làm mát mẻ, nhưng eumiro đã đóng đinh cái này. – fraxel

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