7

numpyを正規化/標準化する最良の方法は何だろうかrecarray。明確にするために、私は数学的マトリックスについて話しているのではなく、たとえばテキスト列(ラベルなど)も含むレコード配列について話しているのです。

a = np.genfromtxt("iris.csv", delimiter=",", dtype=None)
print a.shape
> (150,)

ご覧a[:,:-1]のように、形状が一次元であるため、例えば加工することはできません。

私が見つけた最善の方法は、すべての列を反復処理することです。

for nam in a.dtype.names[:-1]:
    col = a[nam]
    a[nam] = (col - col.min()) / (col.max() - col.min())

これを行うためのよりエレガントな方法はありますか?どこかに「正規化」や「標準化」などの方法はありますか?

4

2 に答える 2

7

それを行うにはいくつかの方法がありますが、いくつかは他よりもきれいです。

通常、numpyでは、文字列データを別の配列に保持します。

(たとえば、Rのデータフレームよりも少し低レベルです。通常は、関連付けのためにクラスにまとめるだけですが、異なるデータ型は別々に保持します。)

正直なところ、numpyはこのような「柔軟な」データ型を処理するために最適化されていません(確かにそれは可能ですが)。「スプレッドシートのような」データのためのより良いインターフェースを提供するようなものですpandas(そしてパンダはnumpyの上にある単なるレイヤーです)。

ただし、構造化配列(ここにあるもの)を使用すると、フィールド名のリストを渡すときに列ごとにスライスできます。(例data[['col1', 'col2', 'col3']]

とにかく、1つの方法は次のようなことをすることです:

import numpy as np

data = np.recfromcsv('iris.csv')

# In this case, it's just all but the last, but we could be more general
# This must be a list and not a tuple, though.
float_fields = list(data.dtype.names[:-1])

float_dat = data[float_fields]

# Now we just need to view it as a "regular" 2D array...
float_dat = float_dat.view(np.float).reshape((data.size, -1))

# And we can normalize columns as usual.
normalized = (float_dat - float_dat.min(axis=0)) / float_dat.ptp(axis=0)

ただし、これは理想からはほど遠いです。(現在のように)インプレースで操作を実行する場合、最も簡単な解決策は、すでに持っているものです。フィールド名を繰り返すだけです。

ちなみに、を使用するpandasと、次のようになります。

import pandas
data = pandas.read_csv('iris.csv', header=None)

float_dat = data[data.columns[:-1]]
dmin, dmax = float_dat.min(axis=0), float_dat.max(axis=0)

data[data.columns[:-1]] = (float_dat - dmin) / (dmax - dmin)
于 2012-03-19T18:56:14.580 に答える
1

どのバージョンのNumPyを使用していますか?バージョン1.5.1では、この動作は発生しません。例として短いテキストファイルを作成し、次のように保存しましたtest.txt

last,first,country,state,zip
tyson,mike,USA,Nevada,89146
brady,tom,USA,Massachusetts,02035

次に次のコードを実行すると、次のようになります。

>>> import numpy as np
>>> a = np.genfromtxt("/home/ely/Desktop/Python/test.txt",delimiter=',',dtype=None)
>>> print a.shape
(3,5)
>>> print a
[['last' 'first' 'country' 'state' 'zip']
 ['tyson' 'mike' 'USA' 'Nevada' '89146']
 ['brady' 'tom' 'USA' 'Massachusetts' '02035']]
>>> print a[0,:-1]
['last' 'first' 'country' 'state']
>>> print a.dtype.names
None

私はあなたのデータについて何が違うのか疑問に思っています。

于 2012-03-19T18:57:31.450 に答える