2016-12-14 13 views
8

軸に沿って関数n個のアイテムを適用する方法を探しています。例えば。軸に沿って関数n個のアイテムを一度に適用する

array([[ 1, 2], 
     [ 3, 4], 
     [ 5, 6], 
     [ 7, 8]]) 

私は行全体にsumを適用した場合、私は取得時に2つの項目:

2行と最後の2行第一の sumある
array([[ 4, 6], 
     [ 12, 14]]) 

NB:私ははるかに大きな配列を扱っており、実行時に決定できるn個の項目に関数を適用する必要があります。


データは、異なる軸に沿って延びています。例えば。

array([[... [ 1, 2, ...], 
      [ 3, 4, ...], 
      [ 5, 6, ...], 
      [ 7, 8, ...], 
      ...], ...]) 
+0

大きいです。 –

+0

このようなケースの例を追加することもできます。 – Benjamin

+0

例を追加しました。 –

答えて

3

これは減少である:限り、あなたは "y" を軸に長い意味、あなたが拡張できる "大きな" などによる

numpy.add.reduceat(a, [0,2]) 
>>> array([[ 4, 6], 
      [12, 14]], dtype=int32) 

a = numpy.array([[ 1, 2], 
       [ 3, 4], 
       [ 5, 6], 
       [ 7, 8], 
       [ 9, 10], 
       [11, 12]]) 
numpy.add.reduceat(a, [0,2,4]) 
>>> array([[ 4, 6], 
      [12, 14], 
      [20, 22]], dtype=int32) 

編集:実際には「両方のディメンションが大きい」の場合でもうまく機能します。

a = numpy.arange(24).reshape(6,4) 
numpy.add.reduceat(a, [0,2,4]) 
>>> array([[ 4, 6, 8, 10], 
      [20, 22, 24, 26], 
      [36, 38, 40, 42]], dtype=int32) 

あなたの特定のケースにインデックスを適応させるためにあなたに任せます。

a.reshape(a.shape[0]//n,n,a.shape[1]).sum(1) 

それはかなりであるべきである - これと同様に、3Dアレイを有しており、その分割された軸に沿って合計する長nであるような第2の分割軸に、2つの軸に第一の軸を分割

+0

「[0,2,4]」が何であるか分かりませんでした。最後の '4'の意味は? –

+2

第1軸(y)方向では、加算の範囲の「開始」を表します。たとえば、0:2,2:4,4:endなどです。最後の例では、 'a [4:、:]]は' array([[16,17,18,19]、[20,21,22,23]) 'を返します。 – Benjamin

1

n = 2 
# calculate the cumsum along axis 0 and take one row from every n rows 
cumarr = arr.cumsum(axis = 0)[(n-1)::n]     

# calculate the difference of the resulting numpy array along axis 0 
np.vstack((cumarr[0][None, :], np.diff(cumarr, axis=0))) 

# array([[ 4, 6], 
#  [12, 14]]) 
2

リシェイプ、再構成として効率的です。入力配列へのビューを作成するだけです。

サンプル実行 - 複数の次元で

In [55]: a 
Out[55]: 
array([[2, 8, 0, 0], 
     [1, 5, 3, 3], 
     [6, 1, 4, 7], 
     [0, 4, 0, 7], 
     [8, 0, 8, 1], 
     [8, 3, 3, 8]]) 

In [56]: n = 2 # Sum every two rows 

In [57]: a.reshape(a.shape[0]//n,n,a.shape[1]).sum(1) 
Out[57]: 
array([[ 3, 13, 3, 3], 
     [ 6, 5, 4, 14], 
     [16, 3, 11, 9]]) 
関連する問題