我有一个csv文件,其中一些列包含测量值(包括错误值)。我想使用numpygenfromtxt将所有内容导入python,并使用dtype格式化数组。假设我有一个csv文件,格式如下:
# Name, Time, Intensity
Sample1, 300, 1000+-5
Sample2, 300, 1500+-2
我想解析整个文件,并将value和inconsibility拆分为列强度的两个子列。我定义了两种数据类型:
^{pr2}$使用此数据类型,我首先自己创建一个测试数组:
Intensity = np.array([(2000, 12)], dtype=TypeValErr)
CSVentry = np.array([("Sample3", 300, Intensity)], dtype=TypeCSV)
print(CSVentry)
这给了我预期的输出
[('Sample3', 300, (2000, 12))]
在下一步中,我想使用这个数据类型导入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和4列,它可以工作(嵌套的dtype和all)
因此,它能够获取一个简单的值列表,例如
['Sample1', 300, 1000, 5]
,并将它们映射到嵌套元组上,以保存此数据类型:('Sample1', 300, (1000, 5))
。在但是转换器不能将
['Sample1', '300', '1000+-5']
转换为['Sample1', '300', (1000, 5)]
,或者,如果它这样做了,它就不是后续使用的正确方法。在错误消息中的
^{pr2}$dtype_flat
是:因此,您的嵌套数据类型是用如下序列生成的:
事实上,在错误行之前有一个这样的注释
data
此时是“row”元组的列表,这些元组已经通过转换器传递:简化了转换过程
但实际上更接近:
因此,长短之分在于
converters
不能将一列拆分为2列或更多列。拆分、转换然后映射到数据类型的过程以错误的顺序发生。我在一开始演示的可能是简单的-通过文本处理行逐行传递文件。它将用指定的分隔符替换+-
。然后,文件将具有正确的列数来处理您的数据类型。在相关问题 更多 >
编程相关推荐