2016-03-18 9 views
0

numpyライブラリからgenfromtxtを使用してすべての文字列を除外することはできますか?numpyでgenfromtxtから列を除外

このタイプのデータは、機械学習のウェブサイトから入手できます。それは理にかなって私は、文字列であるすべての列を除外したいnanとして文字列をラベルnp.genfromtxt(path, dtype=float, names=None,delimiter=',')私の設定と現在

antelope,1,0,0,1,0,0,0,1,1,1,0,0,4,1,0,1,1 

私にはusecols=(1,2)というパラメータがありますが、これを指定するには、使用する必要のあるデータセットを指定する必要があります。むしろ包含方法よりむしろ「除外」方法を好む。

別の方法を使用するか、各行を自分で処理する必要がありますか?

+0

あなたは 'genfromtxt'を使う特別な理由はありますか?これは、[pandas](http://pandas.pydata.org/)のDataFrameを使ったかなり簡単な使用例です。 –

+0

いいえ私は図書館に囲まれていません。あなたはパンダでどうやってやりますか? – lzc

答えて

1

パンダにはDataFrame.select_dtypesメソッドがあり、これを非常に簡単に行うことができます。あなたは、直接(下記の例のように)、または種々の読み出し方法(例えば、pd.read_csv())のいずれかを使用して、データフレームにデータを取得することができ:

In [21]: import pandas as pd 

In [22]: df = pd.DataFrame({'a': [1,2,3,4,5], 'b': ['a','b','c','d','e'], 'c': [1.1, 2.2, 3.3, 4.4, 5.5]}) 

In [23]: df 
Out[23]: 
    a b c 
0 1 a 1.1 
1 2 b 2.2 
2 3 c 3.3 
3 4 d 4.4 
4 5 e 5.5 

In [24]: df.select_dtypes([int, float]) 
Out[24]: 
    a c 
0 1 1.1 
1 2 2.2 
2 3 3.3 
3 4 4.4 
4 5 5.5 
1

あなたが読んだ後nanで列を除外できました。

In [52]: txt=b'antelope,1,0,0,1,0,0,0,1,1,1,0,0,4,1,0,1,1' 
In [53]: txt=[txt,txt] 
In [54]: A=np.genfromtxt(txt, dtype=float, names=None,delimiter=',') 
In [55]: A 
Out[55]: 
array([[ nan, 1., 0., 0., 1., 0., 0., 0., 1., 1., 1., 
      0., 0., 4., 1., 0., 1., 1.], 
     [ nan, 1., 0., 0., 1., 0., 0., 0., 1., 1., 1., 
      0., 0., 4., 1., 0., 1., 1.]]) 

カラムはすべての行でnanです。またはnanの列には.anyを使用できます。他のテストも可能です。

In [56]: ind=np.isnan(A).all(axis=0) 
In [57]: ind 
Out[57]: 
array([ True, False, False, False, False, False, False, False, False, 
     False, False, False, False, False, False, False, False, False], dtype=bool) 
In [58]: A[:,~ind] 
Out[58]: 
array([[ 1., 0., 0., 1., 0., 0., 0., 1., 1., 1., 0., 0., 4., 
     1., 0., 1., 1.], 
     [ 1., 0., 0., 1., 0., 0., 0., 1., 1., 1., 0., 0., 4., 
     1., 0., 1., 1.]]) 

もう一つのアイデアは、genfromtxtは、各列のDTYPEを選択させる、dtype=Noneで一度ファイルを読むことです。結果として得られる化合物のdtypeは、目的のタイプの列を見つけるためにフィルタリングすることができます。

In [118]: A=np.genfromtxt(txt, dtype=None, names=None,delimiter=',') 
In [119]: ind=[i for i, d in enumerate(A.dtype.descr) if d[1]=='<i4'] 
In [120]: A=np.genfromtxt(txt, dtype=None, names=None,delimiter=',',usecols=ind) 
In [121]: A 
Out[121]: 
array([[1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 4, 1, 0, 1, 1], 
     [1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 4, 1, 0, 1, 1]]) 

DTYPEも単一DTYPE(INT)を有する2Dアレイには、この構造化されたアレイを統合するが正しいタイプ

In [128]: A=np.genfromtxt(txt, dtype=None, names=None,delimiter=',') 
In [129]: ind=[d[0] for d in A.dtype.descr if d[1]=='<i4'] 
In [130]: A[ind] 
Out[130]: 
array([(1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 4, 1, 0, 1, 1), 
     (1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 4, 1, 0, 1, 1)], 
     dtype=[('f1', '<i4'), ('f2', '<i4'), ('f3', '<i4'), ('f4', '<i4'), ('f5', '<i4'), ('f6', '<i4'), ('f7', '<i4'), ('f8', '<i4'), ('f9', '<i4'), ('f10', '<i4'), ('f11', '<i4'), ('f12', '<i4'), ('f13', '<i4'), ('f14', '<i4'), ('f15', '<i4'), ('f16', '<i4'), ('f17', '<i4')]) 

ある列名を収集するために濾過することができる、のビットで痛み(私は必要に応じて詳細に入ることができます)。

関連する問題