9

NumPyで2D配列のブロック平均を見つけたいです。簡単にするために、配列は次のようになっていると仮定します。

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

この配列をサイズ2x4の3つのブロックに分割し、3つのブロックすべての平均を求めます(平均の形状が2x4になるようにします。最初のブロックは最初の4列で形成され、次のブロックは次の列で形成されます) 4列など。つまり、私のブロックは次のとおりです。

array([[0, 1, 2, 3],
       [12, 13, 14, 15]])

array([[ 4,  5,  6,  7],
       [16, 17, 18, 19]])

array([[ 8,  9, 10, 11],
       [20, 21, 22, 23]])

ループを使用してこれを行うことはできますが、最初にこの配列を3D配列に変換してから、3番目の軸に沿って3D配列でこのメソッドをreshape使用する方がよいと感じています。これは、この質問meanに似ている可能性があります。

誰かが私に提供してくれれば幸いです:

1)。そのようなトリックが存在する場合、3Dに変換することさえせずにブロック平均を実行するための適切なPythonicコマンド。

2)。2Dから3Dへの変換を行うための適切なPythonicコマンドでない場合。

3)。ループを使用するか、上記のコマンドを使用して実行する方が(スペースの観点から)効率的かどうかについての洞察。

4

2 に答える 2

5

Numpyメソッドはほとんどの場合Pythonループを打ち負かすので、1をスキップします。

2に関しては、この特定のケースでは、次のように機能します。

a = np.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]])
a = a.reshape(2, 3, 4)
>>> 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]]])
>>> np.mean(a, axis=1)
array([[  4.,   5.,   6.,   7.],
       [ 16.,  17.,  18.,  19.]])

トリックはにありreshapeます。列のブロックが必要な一般的なケースでnは、以下がオプションです

a = a.reshape((a.shape[0], -1, n))

3でのあなたの懸念はほとんど不当です。reshapeはコピーではなく元の配列のビューを返すため、3Dへの変換では、実際のデータをコピーすることなく、配列の属性shapeと属性を変更するだけで済みます。strides

編集 再整形が配列をコピーせず、ビューを返すことを確認するには、次のように再整形を行います

a.shape = a = a.reshape((a.shape[0], -1, n))

ドキュメントの例は、次の行に沿っています。

>>> a = np.arange(12).reshape(3,4)
>>> b = a.T
>>> b.shape = (12,)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: incompatible shape for a non-contiguous array

そして、一般的に、あなたがあなたのアレイで、、などをしtransposerollaxisいる場合にのみ問題があります。swapaxes

于 2013-01-09T06:12:02.510 に答える
-1

私はあなたの番号1)に答えることができます。

vstack([mean(a[:,4*i:4*(i+1)],axis=1) for i in range(3)]).T
于 2013-10-21T21:38:08.237 に答える