7

次の配列があるとします。

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

最初の行の最初の 2 つの値を合計したい1+2 = 3: 私の望む出力はこれです:3+4 = 75+6 = 11

array([[ 3,  7, 11],
       [15, 19, 23],
       [ 8, 13, 17]])

私は次の解決策を持っています:

def sum_chunks(x, chunk_size):
    rows, cols = x.shape
    x = x.reshape(x.size / chunk_size, chunk_size)
    return x.sum(axis=1).reshape(rows, cols/chunk_size)

しかし、それは不必要に複雑に感じます。より良い方法はありますか? もしかしてビルトイン?

4

3 に答える 3

7

スライスを使用するだけです:

a[:,::2] + a[:,1::2]

これは、すべての偶数インデックス列 ( )::2によって形成される配列を取得し、すべての奇数インデックス列 ( 1::2) によって形成される配列に追加します。

于 2013-09-03T00:57:50.750 に答える
6

この種のことをしなければならないときは、2D 配列を 3D 配列に再形成してから、余分な次元を で折りたたむことを好みnp.sumます。これを n 次元配列に一般化すると、次のようになります。

def sum_chunk(x, chunk_size, axis=-1):
    shape = x.shape
    if axis < 0:
        axis += x.ndim
    shape = shape[:axis] + (-1, chunk_size) + shape[axis+1:]
    x = x.reshape(shape)
    return x.sum(axis=axis+1)

>>> a = np.arange(24).reshape(4, 6)
>>> a
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17],
       [18, 19, 20, 21, 22, 23]])
>>> sum_chunk(a, 2)
array([[ 1,  5,  9],
       [13, 17, 21],
       [25, 29, 33],
       [37, 41, 45]])
>>> sum_chunk(a, 2, axis=0)
array([[ 6,  8, 10, 12, 14, 16],
       [30, 32, 34, 36, 38, 40]])
于 2013-09-03T02:33:51.820 に答える
1

1 つの方法を次に示します。

>>> a[:,::2] + a[:,1::2]
array([[ 3,  7, 11],
       [15, 19, 23],
       [ 8, 13, 17]])
于 2013-09-03T00:57:49.407 に答える