0

多次元データをn x m行列(<class 'numpy.matrixlib.defmatrix.matrix'>)の中央に配置したいとしますX。新しい配列を定義しました。たとえば、行列のすべての行の平均を生成しones(645)ます。そして今、私はのすべての行を繰り返し、平均を計算し、この値をの対応するインデックスに割り当てたいと思います。これはscipy/numpyの1行で可能ではありませんか?私はこの言語に慣れておらず、次のようなことを考えています。centVectorXXcentVector

centVector = ones(645)
for key, val in X:
    centVector[key] = centVector[key] * (val.sum/val.size)

その後、すべての行の平均を差し引く必要があります。

X = X - centVector

どうすればこれを単純化できますか?編集:さらに、上記のコードは実際には機能していません-キーと値のループには、のようなものが必要ですenumerate(X)。そして、私はX - centVector適切な解決策を返しているかどうかわかりません。

4

1 に答える 1

1

まず、いくつかのサンプルデータ:

>>> import numpy as np
>>> X = np.matrix(np.arange(25).reshape((5,5)))
>>> print X
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]
 [20 21 22 23 24]]

numpyには便利なmean機能があります。ただし、デフォルトでは、配列内のすべての値の平均が表示されます。各行の平均が必要なのでaxis、操作のを指定する必要があります。

>>> np.mean(X, axis=1)
matrix([[  2.],
        [  7.],
        [ 12.],
        [ 17.],
        [ 22.]])

言うことに注意してください:列に沿って(各行axis=1の)平均を求めます。ここで、0 =行、1 =列(など)です。これで、元々行ったように、この平均をから差し引くことができます。X

未承諾のアドバイス

通常、マトリックスクラスは避けるのが最善です(ドキュメントを参照)。np.matrixサンプルデータから呼び出しを削除すると、通常のnumpy配列が得られます。

残念ながら、この特定のケースでは、配列を使用するnp.meanと1D配列が返されるため、状況が少し複雑になります。

>>> X = np.arange(25).reshape((5,5))
>>> r_means = np.mean(X, axis=1)
>>> print r_means
[  2.   7.  12.  17.  22.]

からこれを減算しようとするとXr_means列ベクトルではなく行ベクトルにブロードキャストされます。

>>> X - r_means
array([[ -2.,  -6., -10., -14., -18.],
       [  3.,  -1.,  -5.,  -9., -13.],
       [  8.,   4.,   0.,  -4.,  -8.],
       [ 13.,   9.,   5.,   1.,  -3.],
       [ 18.,  14.,  10.,   6.,   2.]])

したがって、1D配列をN x 1列ベクトルに再形成する必要があります。

>>> X - r_means.reshape((-1, 1))
array([[-2., -1.,  0.,  1.,  2.],
       [-2., -1.,  0.,  1.,  2.],
       [-2., -1.,  0.,  1.,  2.],
       [-2., -1.,  0.,  1.,  2.],
       [-2., -1.,  0.,  1.,  2.]])

pass toは、元の配列の形状と新しい配列の残りの次元に基づいてこの次元を計算するようにnumpyに指示します-1reshapeまたは、を使用して配列の形状を変更することもできますr_means[:, np.newaxis]

于 2012-06-02T11:35:38.537 に答える