用双括号读取numpy数组

时间:2017-03-04 20:18:15

标签: 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数组或熊猫Serie。 我试过了

filters

我得到了

  

ValueError:无法将字符串转换为float:[[1.62434536]

然后我试了

np.loadtxt('data.txt', delimiter = '\n', unpack = True)

它有效,但感觉很难看。我想知道是否有更优雅的方式来读取numpy数组。

3 个答案:

答案 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']

我知道这里的正则表达式看起来很可怕,但是一旦你意识到你正在编码"它真的很简单。你在寻找什么。

即。在我们的案例中:

  • \ D - 表示任何非数字(负号,空白)
  • \ d - 表示任何数字
  • 。 - ......小数点
  • \ d {8} - 用于结尾十进制数

当然,这可能不是最佳答案,但它应该为您提供另一种在过去帮助我的工具。您可以在https://regex101.com

了解更多信息并进行实时测试

答案 1 :(得分:0)

您似乎正在编写此代码,您认为这些代码无法解决从numpy数组输出格式化的数据问题。您没有提到这些数据是如何传递给您的,但是在写入data.txt时格式化数据可能更“优雅”。也许有array2string()? https://docs.scipy.org/doc/numpy/reference/routines.io.html

答案 2 :(得分:0)

[]的存在和,的缺失使得这种字符串的正常解析变得尴尬。不止一次,从SO问题复制时我只是咬了一下子弹并编辑了粘贴,所以它会解析。

使用loadtxtgenfromtxt需要删除[]。解析为列表需要添加,

在此示例中,将\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]]