2012-05-21 32 views
8

减少阵列的分辨率。如果我有一个这样的阵列:通过求和

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

我想“改变分辨率”,和由2个COLS结束了一个较小的阵列,(比方说2行,或2行×4列等)。我希望通过总结来实现这一决议更改。我需要这个来处理大型数组,行数,较小数组的cols总是大数组的因子。

减少上述阵列2×2阵列将导致(这就是我想要的):

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

我有这个功能,做它罚款:

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

我我已经通过examples看了很长时间,但似乎无法找到任何有用的东西。

有没有更快的方式来做到这一点,而不需要循环?

+0

如果工作正常,您的问题是什么? –

+0

@尼克德克莱因 - 编辑澄清。我追求更快的方法来做到这一点。 – fraxel

+0

想要做这类事情的人往往会使用'itertools'模块,可能值得一看。 – heltonbiker

回答

21

你的榜样:

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

回报:

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

现在让我们创建一个通用的函数......

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

作品为你的例子:

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

这是惊人的“Numpythonic”。 – heltonbiker

+0

(+1)聪明!... – NPE

+0

正是我在寻找的感谢! – fraxel

3

我敢肯定,有没有所有这些可怕的循环更好/更聪明的办法...

这里是为了避免明确的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)) 

在我的机器上,这比你的版本快了约30%(shrink(a, 2, 2))。

+0

+1非常感谢,很酷的做法,但eumiro钉了这一个。 – fraxel