12

如果我有这样的数组:

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

我想“更改分辨率”,并最终得到一个较小的数组(比如 2 行乘 2 列,或 2 行乘 4 列等)。我希望通过求和来发生这种分辨率变化。我需要它来处理大型数组,较小数组的行数和列数将始终是较大数组的一个因素。

将上述数组减少为 2 x 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.]]

我已经浏览了这些示例,但似乎找不到任何有帮助的东西。

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

4

2 回答 2

30

用你的例子:

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

返回:

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

现在让我们创建一个通用函数……</p>

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]])
于 2012-05-21T13:08:50.747 回答
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))

在我的机器上,这比您的版本(对于shrink(a, 2, 2))快 30%。

于 2012-05-21T13:03:52.070 回答