基本的な問題は、NumPy が引用符を取り除くという概念を理解していないことです (csv
モジュールは理解しています)。と言うときdelimiter='","'
、列区切り文字が文字通り引用符で囲まれたコンマであることを NumPy に伝えていることになります。
converters
関数のドキュメントを見ると、パラメータを設定して引用符を削除する必要があると思います(デフォルトではそうではありません):
import re
import numpy as np
fieldFilter = re.compile(r'^"?([^"]*)"?$')
def filterTheField(s):
m = fieldFilter.match(s.strip())
if m:
return float(m.group(1))
else:
return 0.0 # or whatever default
#...
# Yes, sorry, you have to know the number of columns, since the NumPy docs
# don't say you can specify a default converter for all columns.
convs = dict((col, filterTheField) for col in range(numColumns))
data = np.genfromtxt(csvfile, dtype=None, delimiter=',', names=True,
converters=convs)
または、放棄np.genfromtxt()
しcsv.csvreader
て、ファイルの内容を文字列のリストとして一度に 1 行ずつ提供してから、要素を反復処理してマトリックスを作成します。
reader = csv.csvreader(csvfile)
result = np.array([[float(col) for col in row] for row in reader])
# BTW, column headings are in reader.fieldnames at this point.
編集:さて、ファイルがすべてフロートではないようです。convs
その場合、必要に応じて設定genfromtxt
するか、変換関数のベクトルを作成できますcsv.csvreader
。
reader = csv.csvreader(csvfile)
converters = [datetime, float, int, float]
result = np.array([[conv(col) for col, conv in zip(row, converters)]
for row in reader])
# BTW, column headings are in reader.fieldnames at this point.
編集 2: わかりました、可変列数... データ ソースは単に生活を困難にしたいだけです。幸いなことに、使用できるのはmagic
...
reader = csv.csvreader(csvfile)
result = np.array([[magic(col) for col in row] for row in reader])
... wheremagic()
は関数のために頭の中で思いついた名前です。(サイケ!)
最悪の場合、次のようになります。
def magic(s):
if '/' in s:
return datetime(s)
elif '.' in s:
return float(s)
else:
return int(s)
NumPy には、文字列を受け取り、正しい型の単一の要素を返す関数があるかもしれません。 numpy.fromstring()
近いように見えますが、タイムスタンプのスペースを列区切りとして解釈する場合があります。
PS 1つの欠点csvreader
は、コメントを破棄しないことです。実際のcsv
ファイルにはコメントがありません。