エラー値を含む測定値を含むいくつかの列を持つcsvファイルがあります。私はnumpy genfromtxtを使ってすべてをPythonにインポートし、dtypeを使って配列をフォーマットしたいと思います。のは、私がこの形式でCSVファイルを持っていると仮定しましょう:私はコラム強度の2つのサブ列にファイル全体と分割値と不確実性を解析したいnumpyのdtypeとコンバーターを使用したサブカラムの分割csv列
# Name, Time, Intensity
Sample1, 300, 1000+-5
Sample2, 300, 1500+-2
。私は2つのdtypesに定義:このdtypesを使用して
import numpy as np
TypeValErr = np.dtype([("value", np.int32), ("error", np.int32)])
TypeCSV=np.dtype({"names": ["name", "time", "intensity"],
"formats": ["U32", np.int32, TypeValErr],
"titles": ["Name", "Time", "Intensity"]})
を、私が最初に自分でちょうどテストアレイを作成します。次のステップでは、私に期待される出力
[('Sample3', 300, (2000, 12))]
を与える
Intensity = np.array([(2000, 12)], dtype=TypeValErr)
CSVentry = np.array([("Sample3", 300, Intensity)], dtype=TypeCSV)
print(CSVentry)
をこのdtypeを使用してCSVをインポートします。強度列が間違った形式を持っているように、私は適切なフォーマットに出力を変換するコンバータを使用する:
def convertToValErrArr(txt):
splitted = txt.split("+-")
return np.array([(splitted[0], splitted[1])], dtype=TypeValErr)
print(np.array([("Sample3", 300, convertToValErrArr("1800+-7"))], dtype=TypeCSV))
出力が再び期待
[('Sample3', 300, (1800, 7))]
しかし、最終的には、輸入自体を与えますエラーを投げます。
ConvertFunc = lambda x: convertToValErrArr(x)
file = np.genfromtxt("test.csv",
delimiter=",",
autostrip=True,
dtype=TypeCSV,
skip_header=1,
converters={2: lambda x: convertToValErrArr(str(x))})
そして、ここに私のエラーです:
Traceback (most recent call last):
File "csvimport.py", line 28, in <module>
converters={2: lambda x: convertToValErrArr(str(x))})
File "/usr/lib/python3.6/site-packages/numpy/lib/npyio.py", line 1896, in genfromtxt
rows = np.array(data, dtype=[('', _) for _ in dtype_flat])
ValueError: size of tuple must match number of fields.
私は間違いを見ていないが、ここに私のコードです。 genfromtxtは別の方法でデータを処理していますか?私は誰かがアイデアを持っていることを願っていますどうもありがとう。あなたのDTYPEで
フィールドを2つに分割して動作させることができないコンバータをテストしました。私はそれが不可能だとは言わないが、それはコンバータの意図された使用ではない。しかし、なぜそれが失敗するのか、何かファッジがあるのかを知るためには、genfromtxtを調べなければなりません。 – hpaulj
'TypeCSV'は4列のファイルで動作しますか? – hpaulj