2017-07-31 16 views
1

さまざまな数の列を持つテキストファイルからデータをインポートしようとしています。私は、最初の列は常にintであり、その後のcolsはすべてのファイルで浮動することがわかります。 dtypesを使ってこれを明示的に指定するにはどうすればよいですか?genfromtxt異なるデータ型

dtypes=[int,float,float,float...] #this number will change depending on the number of columns in the file 

data=np.genfromtxt(file,dtype=dtypes,delimiter='\t',skip_header=11) #read in 
the data 

おかげ

+0

入力ファイルの最初の数行と受信したエラーメッセージを投稿できますか? –

+0

'dtype = None'はあなたのために働くでしょうか?または、dtypeをデフォルトのfloatのままにして、構造化された配列の代わりに2次元配列を取得します。 – hpaulj

+0

後で2D配列を必要とし、データをスライスして特定の列を変更したい。私はフロートとして残すことができますが、私は新しいファイルを作成しており、可能な限り整数を整数に減らすことによって、ファイルサイズをできるだけ小さくしたいと考えています。 –

答えて

0

あなたが最初floats、すべてを読んで、あなたが持っているどのように多くの列を知った後structured arrayに配列を変換することもできます。これは、次の出力を与える

##input.txt: 
## 1 1.4 5e23 
## 2 2.3 5e-12 
## 3 5.7 -1.3e-2 

import numpy as np 

data = np.genfromtxt('input.txt') 
print(data) 
print('-'*50) 

colw = data.shape[1] 

dtypes = [('col0', int)]+[('col{}'.format(i+1),float) for i in range(colw-1)] 
print(dtypes) 
print('-'*50) 

converted_data = np.array([tuple(r) for r in data], dtype = dtypes) 

print(converted_data) 

[[ 1.00000000e+00 1.40000000e+00 5.00000000e+23] 
[ 2.00000000e+00 2.30000000e+00 5.00000000e-12] 
[ 3.00000000e+00 5.70000000e+00 -1.30000000e-02]] 
-------------------------------------------------- 
[('col0', <class 'int'>), ('col1', <class 'float'>), ('col2', <class 'float'>)] 
-------------------------------------------------- 
[(1, 1.4, 5.00000000e+23) (2, 2.3, 5.00000000e-12) 
(3, 5.7, -1.30000000e-02)] 

Python 3.5でテスト済み

関連する問題