Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 带双括号的读取numpy数组_Python_Arrays_Numpy_File Io - Fatal编程技术网

Python 带双括号的读取numpy数组

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:无法将字符串转换为浮

我的数据文件('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]

然后我试着

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读取。a
tolist()
打印更容易复制和通过。对。这是作业的输入,所以我无法选择数据格式。这实际上是作业中的数据。我得到的数据是这样的。我知道我们通常应该使用pickle或其他不带括号的格式来保存numpy数组。谢谢Leonardo。我有时使用regexp。我只是imag因为这是numpy的输出,所以可能有一个我不知道的函数直接“将其收回”"@flyerwolf你试过了吗?np.save特别有一个例子可能会对你有所帮助我知道。我认为它使用pickle对吗?这取决于我,我只使用load和save。谢谢。这正是我想要的。那么“u”表示最后输出?交互式shell通常将最后输出保存在名为
\u
的变量中。我正在使用ng
ipython
哪一个可以做到这一点以及更多。