9

要素が3次元のNumpy3軸配列があります。それらを平均して、同じ形状の配列を返したいと思います。通常の平均関数は、3つの次元を削除し、それを平均に置き換えます(予想どおり)。

a = np.array([[[0.1, 0.2, 0.3], [0.2, 0.3, 0.4]],
              [[0.4, 0.4, 0.4], [0.7, 0.6, 0.8]]], np.float32)

b = np.average(a, axis=2)
# b = [[0.2, 0.3],
#      [0.4, 0.7]]

必要な結果

# b = [[[0.2, 0.2, 0.2], [0.3, 0.3, 0.3]],
#      [[0.4, 0.4, 0.4], [0.7, 0.7, 0.7]]]

これをエレガントに行うことはできますか、それともPythonで配列を反復処理する必要がありますか(強力なNumpy関数に比べてはるかに遅くなります)。

np.mean関数のDtype引数をおそらく1D配列に設定できますか?

ありがとう。

4

5 に答える 5

6

わかりました、注意私はまだnumpyologyのマスターを持っていませんが、ただ遊んでいるだけで、私は思いつきました:

>>> np.average(a,axis=-1).repeat(a.shape[-1]).reshape(a.shape)
array([[[ 0.2       ,  0.2       ,  0.2       ],
        [ 0.29999998,  0.29999998,  0.29999998]],

       [[ 0.40000001,  0.40000001,  0.40000001],
        [ 0.69999999,  0.69999999,  0.69999999]]], dtype=float32)
于 2012-05-09T18:30:31.060 に答える
4

放送の利用を考えたことはありますか?ブロードキャストの概念に慣れていない場合は、ブロードキャストに関する詳細情報を次に示します。

を使用した例を次に示します。ここで生成されたは読み取り専用として扱われるべきであることbroadcast_arraysに注意してください。書き込みたい場合は、コピーを作成する必要があります。bbroadcast_arrays

>>> b = np.average(a, axis=2)[:, :, np.newaxis]
>>> b, _ = np.broadcast_arrays(b, a)
>>> b
array([[[ 0.2       ,  0.2       ,  0.2       ],
        [ 0.29999998,  0.29999998,  0.29999998]],

       [[ 0.40000001,  0.40000001,  0.40000001],
        [ 0.69999999,  0.69999999,  0.69999999]]], dtype=float32)
于 2012-05-09T21:34:23.230 に答える
3
>>> import numpy as np
>>> a = np.array([[[0.1, 0.2, 0.3], [0.2, 0.3, 0.4]],
...               [[0.4, 0.4, 0.4], [0.7, 0.6, 0.8]]], np.float32)
>>> b = np.average(a, axis=2)
>>> b
array([[ 0.2       ,  0.29999998],
       [ 0.40000001,  0.69999999]], dtype=float32)
>>> c = np.dstack((b, b, b))
>>> c
array([[[ 0.2       ,  0.2       ,  0.2       ],
        [ 0.29999998,  0.29999998,  0.29999998]],

       [[ 0.40000001,  0.40000001,  0.40000001],
        [ 0.69999999,  0.69999999,  0.69999999]]], dtype=float32)
于 2012-05-09T18:40:30.687 に答える
1

コピーを作成しない方法は次のとおりです。

a = a.T
a[:] = a.mean(axis=0)
a = a.T

または、上書きしたくない場合a

b = np.empty_like(a)
b = b.T
b[:] = a.mean(axis=-1).T
b = b.T
于 2012-05-09T23:25:50.697 に答える
0

これは任意の軸の場合です:

arrayは次元配列で、axis平均する軸です

np.repeat( np.expand_dims( np.mean( array, axis ), axis ), array.shape[axis], axis )
于 2013-10-08T15:28:28.430 に答える