12

このような配列がある場合:

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

「解像度を変更」して、配列を小さくしたい(たとえば、2行×2列、または2行×4列など)。この解像度の変更は、合計によって発生するようにします。大きな配列で動作するためにこれが必要です。行の数、小さな配列の列は常に大きな配列の要因になります。

上記の配列を2x2の配列に減らすと、次のようになります(これが私が望むものです)。

[[ 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:のすべての要素を明示的にループしないようにする1つの方法を次に示します。

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)

于 2012-05-21T13:03:52.070 に答える