web-dev-qa-db-ja.com

pythonのnumpy配列列を正規化します

特定の行の各セルが機能の値を表すnumpy配列があります。それらすべてを100 * 4マトリックスに格納します。

A     B   C
1000  10  0.5
765   5   0.35
800   7   0.09  

各値が0と1の間であるこのnumpy.arrayの行を正規化する方法はありますか?

希望する出力は次のとおりです。

A     B    C
1     1    1
0.765 0.5  0.7
0.8   0.7  0.18(which is 0.09/0.5)

前もって感謝します :)

42
ahajib

私が正しく理解していれば、あなたがしたいことは各列の最大値で割ることです。これは broadcasting を使用して簡単に実行できます。

サンプルの配列から始めます。

import numpy as np

x = np.array([[1000,  10,   0.5],
              [ 765,   5,  0.35],
              [ 800,   7,  0.09]])

x_normed = x / x.max(axis=0)

print(x_normed)
# [[ 1.     1.     1.   ]
#  [ 0.765  0.5    0.7  ]
#  [ 0.8    0.7    0.18 ]]

x.max(0)は、0番目の次元(行)で最大値を取ります。これにより、各列の最大値を含むサイズ(ncols,)のベクトルが得られます。次に、各列の最大値が1にスケーリングされるように値を正規化するために、xをこのベクトルで除算できます。


xに負の値が含まれる場合、最初に最小値を減算する必要があります。

x_normed = (x - x.min(0)) / x.ptp(0)

ここで、x.ptp(0)は、軸0に沿って「ピークツーピーク」(つまり、範囲、最大-最小)を返します。この正規化は、各列の最小値が0になることも保証します。

89
ali_m

Sklearn.preprocessingを使用できます:

from sklearn.preprocessing import normalize
data = np.array([
    [1000, 10, 0.5],
    [765, 5, 0.35],
    [800, 7, 0.09], ])
data = normalize(data, axis=0, norm='max')
print(data)
>>[[ 1.     1.     1.   ]
[ 0.765  0.5    0.7  ]
[ 0.8    0.7    0.18 ]]
16
Marcin Mrugas