我的数据文件('data.txt')是来自numpy数组输出的直接复制粘贴,如:
[[1.62434536] \ n [-0.61175641] \ n [-0.52817175] \ n [-1.07296862] \ n [ 0.86540763] \ n [-2.3015387] \ n [1.74481176] \ n [-0.7612069] \ n [0.3190391] \ n [-0.24937038] \ n [1.46210794] \ n ...]]
我想把它读成一个numpy数组或熊猫Serie。 我试过了
filters
我得到了
ValueError:无法将字符串转换为float:[[1.62434536]
然后我试了
np.loadtxt('data.txt', delimiter = '\n', unpack = True)
它有效,但感觉很难看。我想知道是否有更优雅的方式来读取numpy数组。
答案 0 :(得分:1)
这可能有点像黑客,但您可以使用正则表达式(RegEx),顾名思义,它可以帮助您在重复的字符串中查找数据。这是我的代码:
import numpy as np
import re
nptxtarray = '[[ 1.62434536]\n [-0.61175641]\n [-0.52817175]\n]]'
regex = "\D\d.\d{8}"
my_nparray = np.array(re.findall(regex, nptxtarray), dtype=np.float)
print my_nparray
[' 1.62434536' '-0.61175641' '-0.52817175']
我知道这里的正则表达式看起来很可怕,但是一旦你意识到你正在编码"它真的很简单。你在寻找什么。
即。在我们的案例中:
当然,这可能不是最佳答案,但它应该为您提供另一种在过去帮助我的工具。您可以在https://regex101.com
了解更多信息并进行实时测试答案 1 :(得分:0)
您似乎正在编写此代码,您认为这些代码无法解决从numpy数组输出格式化的数据问题。您没有提到这些数据是如何传递给您的,但是在写入data.txt时格式化数据可能更“优雅”。也许有array2string()? https://docs.scipy.org/doc/numpy/reference/routines.io.html
答案 2 :(得分:0)
[]
的存在和,
的缺失使得这种字符串的正常解析变得尴尬。不止一次,从SO问题复制时我只是咬了一下子弹并编辑了粘贴,所以它会解析。
使用loadtxt
或genfromtxt
需要删除[]
。解析为列表需要添加,
。
在此示例中,将\n
替换为,
很容易。如果每行有多个数字则需要更多工作,用,
替换w / s。
In [252]: txt="[[ 1.62434536]\n [-0.61175641]\n [-0.52817175]\n [-1.07296862]\n [ 0.86540763]\n [-2.3015387 ]\n [ 1.74481176]\n [-0.7612069 ]\n [ 0.31 90391 ]\n [-0.24937038]\n [ 1.46210794]]"
为了使txt
正确,我必须编辑省略号。这是来自你的粘贴,但在现实世界中它可以是数组显示的一部分。
In [253]: txt1=txt.replace('\n',',')
一旦我有,
分隔数据,我可以用几种方式将其解析为列表,并且这样做会创建一个数组。
In [254]: eval(txt1)
Out[254]:
[[1.62434536],
[-0.61175641],
[-0.52817175],
...
[1.46210794]]
In [255]: np.array(_)
Out[255]:
array([[ 1.62434536],
[-0.61175641],
....
[ 1.46210794]])
在某些情况下,eval
太强大了。 json
是一个更安全的列表解析器:
In [256]: import json
In [257]: json.loads(txt1)
Out[257]:
[[1.62434536],
[-0.61175641],
....
[1.46210794]]
是ast
模块中的函数:
In [258]: import ast
In [259]: ast.literal_eval(txt1)
Out[259]:
[[1.62434536],
[-0.61175641],
....
[1.46210794]]