2013-02-20 3 views
13

文字列を含む2D np-arrayとして大きなテキストファイル(約1  GB、3 * 10^6行と10 - 100列)をロードしたいとします。しかし、numpy.loadtxt()はデフォルトで浮動小数点数をとります。配列全体に別のデータ型を指定することは可能ですか?私は運なしで次のことを試してみた:numpy.loadtxt()を使用してテキストファイルを文字列としてロード

loadedData = np.loadtxt(address, dtype=np.str) 

私は、次のエラーメッセージが出ます:

/Library/Python/2.7/site-packages/numpy-1.8.0.dev_20224ea_20121123-py2.7-macosx-10.8-x86_64.egg/numpy/lib/npyio.pyc in loadtxt(fname, dtype, comments, delimiter, converters, skiprows, usecols, unpack, ndmin) 
    833    fh.close() 
    834 
--> 835  X = np.array(X, dtype) 
    836  # Multicolumn data are returned with shape (1, N, M), i.e. 
    837  # (1, 1, M) for a single row - remove the singleton dimension there 

ValueError: cannot set an array element with a sequence 

任意のアイデア? (私のファイル内の正確な列数は事前にわかりません)

答えて

27

代わりにgenfromtxtを使用してください。

import numpy as np 
print np.genfromtxt('col.txt',dtype='str') 

ファイルcol.txt使用:

foo bar 
cat dog 
man wine 

これが与える:

[['foo' 'bar'] 
['cat' 'dog'] 
['man' 'wine']] 

あなたは各行が同じ列数を持っていることが予想される場合にはloadtxtよりもはるかに一般的な方法です最初の行を読み取って、属性filling_valuesを設定して不足行を修正します。

+0

ありがとうございます!それは非常に時間がかかることを除いて、うまく動作します。しかし、私が読んだことから、 'loadtxt'の代わりに' genfromtxt'を使うことが期待されます。物事をスピードアップする方法はありますか?大量のデータをロードするための他の高速な方法はありますか? – user1966176

+0

データセットを何度も繰り返し使用する場合は、生のテキストファイル以外のストレージソリューションを考えることができます。個人的に私はpytablesや別のhd5fソリューションを使っています。 – Hooked

+0

実際には、800Mbのテキストファイルを読み込もうとするとpythonがクラッシュします。それは8GBのRAMと35GBのスワップを使用してメモリをいっぱいにします。 – user1966176

1

NumPy配列が必要ですか?そうしないと、ネストされたリストとしてデータをロードすることで処理が高速化されます。 4000x4000の言葉これはloadtxtよりも約10倍高速であると、テキストファイルの場合

def load(fname): 
    ''' Load the file using std open''' 
    f = open(fname,'r') 

    data = [] 
    for line in f.readlines(): 
     data.append(line.replace('\n','').split(' ')) 

    f.close() 

    return data 

+0

返すときにリストobjをndarrayに変換すると、時間消費量はほぼ同じになります – zhangxaochen

+0

もちろん、この場合は時間を節約できません。それは私が最初の文章に続いて*そうでなければ* – flonk

9

も高速であり、列によって非コンマ列の区切りと自動タイピングをサポートしていますPandasread_csv、あります:

あなたがそのタイプを好む場合には、numpyの配列に変換することができ
import pandas as pd 
df = pd.read_csv('your_file',sep='\t') 

import numpy as np 
arr = np.array(df) 

これは私が見てきた最も簡単で成熟したテキストのインポート方法です。

関連する問題