2016-05-13 6 views
3

私は41個の機能と1つのラベル付きデータセットをロードし、分類のための私のテストセットをインスタンス化しようとしている:IndexError:配列のインデックスが多すぎます。均一ではない42の機能を備えたnumpyの配列

import numpy as np 

f = open("mydataset") 
dataset = np.genfromtxt(f, delimiter=',', dtype=None) 

X = dataset[:, 0:40] # select columns 1 through 41 
y = dataset[:, 41] # select column 42 (the labels) 

mydatasetは(いないすべての要素が同じ持って均一でないので、タイプ)の場合、関数genfromtxtは1次元配列(タプルのリスト)を作成します。だから私はこのエラーが表示されます:

X = dataset[:, 0:40] # select columns 1 through 41 
IndexError: too many indices for array 

どうすればこの問題を解決できますか? numpy配列を2Dで変換することはできますか(そうなら、どのように)?または、別の方法で右の列を選択する必要がありますか?

おかげ

答えて

3

あなたは、化合物のDTYPEを定義することができます。

dt = np.dtype([('values',float,(41,)),('labels','S10')]) 
data=np.genfromtxt(f, delimiters=',',dtype=dt) 
X = data['values'] 
Y = data['labels'] 

(私はサンプルの配列にこのサイズを持っていないので、テストされていません)。

そして、私は最近の答えで説明として、https://stackoverflow.com/a/37126091/901925

それはすべての数字は、フロートとしてロードされている必要がありますけれども、あなたが

data.view(dt) 

で、この化合物のDTYPEにdtype=Noneデータを変換することができ(またはすべてint)。多くの場合、CSVには浮動小数点列と整数列が混在しているため、None genfromtxt呼び出しの数値フィールドには複数のタイプが混在しています。異なるdtypesと

In [421]: data=np.array([('label1', 12, 23.2, 232.0), ('label2', 23, 2324.0, 324.0), 
     ('label3', 34, 123.0, 2141.0), ('label4', 0, 2.0, 3.0)], 
     dtype=[('f0', '<U10'), ('f1', '<i4'), ('f2', '<f8'), ('f3', '<f8')]) 

4フィールド:他の答えからの借入

、一般的な構造化された配列は、次のようになります。

個々のフィールドには、名前data['f0']または名前data[['f0','f3']]の名前でアクセスできます。しかし、名前のリストでできることは限られています。

In [426]: data[['f2','f3']]=10 
... 
ValueError: multi-field assignment is not supported 

あなたはそれをのように均質な配列見る場合は、あなたがコピーを作成する場合は複数の操作を行い、そしてより多くのことができます。

In [427]: d23=data[['f2','f3']].copy() 

In [428]: d23 
Out[428]: 
array([(23.2, 232.0), (2324.0, 324.0), (123.0, 2141.0), (2.0, 3.0)], 
     dtype=[('f2', '<f8'), ('f3', '<f8')]) 

In [429]: d23=d23.view((float,(2,))) 

In [430]: d23 
Out[430]: 
array([[ 2.32000000e+01, 2.32000000e+02], 
     [ 2.32400000e+03, 3.24000000e+02], 
     [ 1.23000000e+02, 2.14100000e+03], 
     [ 2.00000000e+00, 3.00000000e+00]]) 

In [431]: d23+=34 

In [432]: d23 
Out[432]: 
array([[ 57.2, 266. ], 
     [ 2358. , 358. ], 
     [ 157. , 2175. ], 
     [ 36. , 37. ]]) 

d23への変更は、元のdataに影響を与えませんが)。

+0

また、41の機能も同質ではありません(そのうちのいくつかは文字列です)。 – Gil

+0

'dtype = None'で生成された構造化配列にアクセスする例をいくつか追加しました。 – hpaulj

+0

ありがとう@hpaulj!代わりにfor-loopを使ってリストのリストを作成し(ある時点でrawを渡す)、それをnparrayに変換すればどうなると思いますか?さまざまなタイプのフィールドでうまく動作しますか? – Gil

関連する問題