Python 带双括号的读取numpy数组
我的数据文件('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阵列或熊猫系列。 我试过了 我得到 ValueError:无法将字符串转换为浮点:[[1.62434536] 然后我试着Python 带双括号的读取numpy数组,python,arrays,numpy,file-io,Python,Arrays,Numpy,File Io,我的数据文件('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阵列或熊猫系列。 我试过了 我得到 ValueError:无法将字符串转换为浮
f = open('data.txt', 'r')
data_txt = f.read()
data_txt = data_txt.replace('[', '')
data_txt = data_txt.replace(']', '')
np.loadtxt(StringIO.StringIO(data_txt), delimiter = '\n')
它工作,但感觉很难看。我想知道是否有更优雅的方式来读取Nuffy数组。
< P>看起来你编写的代码是不优雅的,用从NUMPY数组输出格式化的数据来解决问题。“优雅”用于在写入data.txt时格式化数据。可能使用array2string()?这可能有点麻烦,但您可以使用正则表达式(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']
我知道这里的正则表达式看起来很吓人,但一旦你意识到你正在“编码”你想要的东西,它实际上非常简单
i、 e.就我们而言:
- \D-表示任何非数字(负号、空格)
- \d-表示任何数字
- .-…小数点
- \d{8}-表示尾随的十进制数
当然,这可能不是最好的答案,但它应该为您提供另一个在过去对我有巨大帮助的工具。您可以了解更多信息,并在
[]的状态下进行现场测试
和缺少,
使得这种字符串的正常解析变得很尴尬。不止一次,当从一个SO问题复制时,我只是咬紧牙关,编辑了粘贴,以便它能够解析
使用loadtxt
或genfromtxt
需要删除[]
。作为列表进行解析需要添加,
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]]"
在本例中,将\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]]
as是ast
模块中的一个函数:
In [258]: import ast
In [259]: ast.literal_eval(txt1)
Out[259]:
[[1.62434536],
[-0.61175641],
....
[1.46210794]]
不确定这是否更优雅,但您可以使用
loadtxt
的converters
关键字。这是一种很难使用的格式。[]会妨碍CSV读取,并且缺少,
使其更难作为有效的Python读取。atolist()
打印更容易复制和通过。对。这是作业的输入,所以我无法选择数据格式。这实际上是作业中的数据。我得到的数据是这样的。我知道我们通常应该使用pickle或其他不带括号的格式来保存numpy数组。谢谢Leonardo。我有时使用regexp。我只是imag因为这是numpy的输出,所以可能有一个我不知道的函数直接“将其收回”"@flyerwolf你试过了吗?np.save特别有一个例子可能会对你有所帮助我知道。我认为它使用pickle对吗?这取决于我,我只使用load和save。谢谢。这正是我想要的。那么“u”表示最后输出?交互式shell通常将最后输出保存在名为\u
的变量中。我正在使用ngipython
哪一个可以做到这一点以及更多。