2012-03-19 3 views
6

numpyを正規化/標準化する最良の方法は何ですか?recarrayです。 これを明確にするために、私は数学的行列については言及していませんが、例えば、テキスト列(ラベルなど)。あなたが見ることができるようにnumpy再配列を正規化/標準化

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

、私は例えばできませんプロセスa[:,:-1]は形状が1次元であるためです。これを行うための

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

どれよりエレガントな方法:

私が見つけた最高のすべてのカラムを反復処理するのですか?どこかで「標準化」や「標準化」などの方法がありますか?

答えて

6

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

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

(物事はRのデータフレーム、たとえば、よりも少し低いレベルです。あなたは、一般的にちょうど関連のクラスで物事を包むが、異なるデータ型が分離しておく。)

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

しかし、構造化配列(これはあなたのものです)は、フィールド名のリストを渡すときに列方向にスライスすることができます。しかし、これは理想からかけ離れている

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) 

:(例えばdata[['col1', 'col2', 'col3']]

いずれにしても、一つの方法は、このような何かを行うことです。インプレースで(現在のように)操作を実行したい場合、最も簡単な解決策は、既に持っているものです。フィールド名を繰り返し処理するだけです。

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) 
+1

+1ありがとうございました。これは非常に有益で洞察に満ちた答えです。データセットを数値列と非数値列に分割するのは、おそらく道のりです。これにより、他の多くの操作が明確に定義され、実際には何をしようとしていたのでしょうか。私は 'data [list]'を使って複数の列を選択するオプションを知らなかった。 –

1

あなたがnumpyののどのバージョンを使用している:

ところで、pandasを使用して、あなたはこのような何かをしたいですか?バージョン1.5.1では、私はこの動作を取得しません。私は、次のコードを実行すると、

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

これは私が得るものです:私はtest.txtとして保存された例として、短いテキストファイルを、作っ

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

私はちょうど約違うのかと思っていますあなたのデータ。

+0

注:これはコメントであり、答えではありませんでした。上記の例に入れる余地がもっと必要でした。 – ely

+0

違いは、構造化配列ではなく文字列配列を取得していることです。あなたの例で 'a'のdtypeを見てください。 –

+0

確かに、入ってくる配列が「構造化」される原因は何ですか?それがcsvファイルの場合、 'genfromtxt()'は常に文字列配列を生成しませんか? – ely

関連する問題