Python numpy genfromtext或numpy loadtxt“;ValueError:无法将字符串转换为浮点值;或;值太多,无法解压缩";,几乎什么都试过了
我有一个非常令人沮丧的问题要解决好几个小时了。我在谷歌上用相关的问题和答案列出了所有的话题 我想做的是: 我有大量的测光数据集(CSV中有50-70k列),我想加载这些数据,然后将它们作为浮点数使用,并最终通过一些配件和计算绘制它们 数据示例如下:Python numpy genfromtext或numpy loadtxt“;ValueError:无法将字符串转换为浮点值;或;值太多,无法解压缩";,几乎什么都试过了,python,csv,numpy,Python,Csv,Numpy,我有一个非常令人沮丧的问题要解决好几个小时了。我在谷歌上用相关的问题和答案列出了所有的话题 我想做的是: 我有大量的测光数据集(CSV中有50-70k列),我想加载这些数据,然后将它们作为浮点数使用,并最终通过一些配件和计算绘制它们 数据示例如下: Time(s),AnalogIn-1,AnalogIn-2 0.00E+00,3.96E-02,3.33E-02 0.00E+00,4.10E-02,3.33E-02 因此,每列都有许多带有科学符号的数字 在我的代码中,我首先使用以下命令加载文本:
Time(s),AnalogIn-1,AnalogIn-2
0.00E+00,3.96E-02,3.33E-02
0.00E+00,4.10E-02,3.33E-02
因此,每列都有许多带有科学符号的数字
在我的代码中,我首先使用以下命令加载文本:
time, dat1, dat2= np.loadtxt(path, skiprows=1, unpack=True, delimiter=",")
它一直在删除“ValueError:无法将字符串转换为浮点值:”
如果我使用Excel,将整个CSV表从“常规”转换为“数字”,效果会很好
我尝试了这里讨论的所有内容,首先跳过标题和第一行,使用
np.loadtxt
、np.genfromtxt
或pandas loader。还试图更改数据类型,修复转换器,重新映射加载到浮点的内容。这很有帮助,但只适用于某些行,并且错误很快会在随机行中弹出,或者弹出“太多值无法解包”我也试着跳过空白。我怀疑在转换过程中仍然存在问题,科学符号确实是一个字符串,它有“随机”顺序的“E”+“和“-”字符。我仍然认为我缺少了一些非常简单的解决方案,因为我的CSV实际上是标准数据。使用您的示例loadtxt
效果很好:
In [142]: np.loadtxt(txt.splitlines(), delimiter=',',skiprows=1)
Out[142]:
array([[ 0. , 0.0396, 0.0333],
[ 0. , 0.041 , 0.0333]])
In [143]: time,dat1,dat2=np.loadtxt(txt.splitlines(), delimiter=',',skiprows=1,
...: unpack=True)
In [144]: time,dat1,dat2
Out[144]: (array([ 0., 0.]), array([ 0.0396, 0.041 ]), array([ 0.0333, 0.0333]))
现在,如果我将其中一个txt行更改为:
0.00E+00,3.96E-02,3.33E+-02
我遇到了一个像你这样的错误:
In [146]: np.loadtxt(txt.splitlines(), delimiter=',',skiprows=1)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-146-ff3d27e104fc> in <module>()
----> 1 np.loadtxt(txt.splitlines(), delimiter=',',skiprows=1)
/usr/local/lib/python3.5/dist-packages/numpy/lib/npyio.py in loadtxt(fname, dtype, comments, delimiter, converters, skiprows, usecols, unpack, ndmin)
1022
1023 # Convert each value according to its column and store
-> 1024 items = [conv(val) for (conv, val) in zip(converters, vals)]
1025 # Then pack it according to the dtype's nesting
1026 items = pack_items(items, packing)
/usr/local/lib/python3.5/dist-packages/numpy/lib/npyio.py in <listcomp>(.0)
1022
1023 # Convert each value according to its column and store
-> 1024 items = [conv(val) for (conv, val) in zip(converters, vals)]
1025 # Then pack it according to the dtype's nesting
1026 items = pack_items(items, packing)
/usr/local/lib/python3.5/dist-packages/numpy/lib/npyio.py in floatconv(x)
723 if b'0x' in x:
724 return float.fromhex(asstr(x))
--> 725 return float(x)
726
727 typ = dtype.type
ValueError: could not convert string to float: b'3.33E+-02
“要解包的值太多”-我不喜欢使用
unpack
,除非我确实知道文件中的列数(甚至可能不知道)
这真的只是一个很长的评论,但如果它发现了问题,它可能是一个答案 使用您在评论中链接的CSV文件,我运行
time, dat1, dat2 = np.loadtxt("data1.csv", skiprows=1, unpack=True, delimiter=",")
而且它没有错误
当我检查文件时,我注意到行尾是一个单回车字符(通常缩写为CR,十六进制代码0d
)。您提到使用Excel,所以我假设您使用的是Windows。在Windows中,通常以CR+LF结尾的行(两个字符:回车符后跟换行符;十六进制0d0a
)
这可能就是问题所在(但我希望Python文件I/O能够解决这个问题)。我没有Windows系统来测试这个,所以目前我只能说“试试这个”:
当您的数据由空格分隔时,为什么要说
delimiter=“,”
?不过,小数分隔符的逗号会成为一个问题。感谢您的注意!我刚刚更正了帖子,格式不好。它确实是“,”分隔符和十进制分隔符是点。在编辑的数据中没有逗号。你为什么说它是逗号分隔的?你能提供到csv的链接吗?谢谢你,沃伦!这实际上与指定usecols[0,1,2]一起工作。是的,它在Windows PC上
In [169]: a1,a2 = np.loadtxt(txt.splitlines(), delimiter=',',skiprows=1,unpack=
...: True)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-169-4dea7c2876c1> in <module>()
----> 1 a1,a2 = np.loadtxt(txt.splitlines(), delimiter=',',skiprows=1,unpack=True)
ValueError: too many values to unpack (expected 2)
In [170]: a1,a2 = np.loadtxt(txt.splitlines(), delimiter=',',skiprows=1,unpack=
...: True, usecols=[1,2])
time, dat1, dat2 = np.loadtxt("data1.csv", skiprows=1, unpack=True, delimiter=",")
with open('data1.csv', 'r', newline='\r') as f:
time, dat1, dat2 = np.loadtxt(f, skiprows=1, unpack=True, delimiter=",")