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:将应该是数组的字符串转换回数组_Python_Arrays_Pandas_Nan - Fatal编程技术网

Python:将应该是数组的字符串转换回数组

Python:将应该是数组的字符串转换回数组,python,arrays,pandas,nan,Python,Arrays,Pandas,Nan,我有一个字符串,它应该是一个3x3数组。只是想找一个简单的方法把它转换回它的“真相”,这样我就可以访问这些值。这是新行,[]和我认为是制表符,但不是7或6个空格。。。。分开 我将一个数组保存到一个pandas数据框中,认为它可以工作,但给出了以下信息: '[[[ nan nan nan]\n [ nan nan nan]\n [ nan nan nan]]\n\n [[ 0.005506

我有一个字符串,它应该是一个3x3数组。只是想找一个简单的方法把它转换回它的“真相”,这样我就可以访问这些值。这是新行,[]和我认为是制表符,但不是7或6个空格。。。。分开

我将一个数组保存到一个pandas数据框中,认为它可以工作,但给出了以下信息:

'[[[      nan       nan       nan]\n  [      nan       nan      
nan]\n  [      nan       nan       nan]]\n\n [[ 0.005506  0.005506    
nan]\n  [ 0.006684       nan       nan]\n  [ 0.006684       nan      
nan]]\n\n [[      nan       nan       nan]\n  [      nan       nan    
nan]\n  [      nan       nan       nan]]]'
我尝试过
.split('\n')
和其他各种分隔符和组合,但收效甚微

查找数组(#只是一个示例):

谢谢

eval()
的罕见用法:

编辑:正如所指出的,eval不足以满足您的要求。我最终得到的工作是基于json和numpy构建的

s = '''[[[ nan nan nan]\n [ nan nan\nnan]\n [ nan nan nan]]\n\n [[ 0.005506 0.005506\nnan]\n [ 0.006684 nan nan]\n [ 0.006684 nan\nnan]]\n\n [[ nan nan nan]\n [ nan nan\nnan]\n [ nan nan nan]]]'''

import numpy, json
x = numpy.array(json.loads(','.join(s.split()).replace('[,','[').replace('nan','NaN')))

print(x)

#array([[[      nan,       nan,       nan],
#        [      nan,       nan,       nan],
#        [      nan,       nan,       nan]],
#       [[ 0.005506,  0.005506,       nan],
#        [ 0.006684,       nan,       nan],
#        [ 0.006684,       nan,       nan]],
#       [[      nan,       nan,       nan],
#        [      nan,       nan,       nan],
#        [      nan,       nan,       nan]]])
您可以轻松地将
numpy.array()
替换为
pandas.DataFrame()

您可以尝试使用Python中包含的 具体来说,您需要使用该函数。请记住,仍然要使用
\n
使用
str.split()

下面是一个关于如何使用它的示例:

import json
json.loads('[[0,1,0],[0,0,0]]')

这是一个只有4个非nan值的小数组,显然您希望将nan值更改为0…从头开始创建它可能更容易。同时,不要试图再次以这种方式保存数组;使用诸如
savetxt
save
、tobuffer`等功能。我正在将其中数千个功能保存到现有文件的一部分,其中一些或多或少具有非NAN。这只是一个例子。然后解决方案是停止以您不知道如何解析的格式保存数千个文件,而是以易于解析的格式保存它们。我做了一个测试,其中a=pd.DataFrame({'test':[]),a=a.append({'test':x},ignore_index=True)对我来说,这似乎很好,但在运行了整个脚本之后,显然有些东西坏了。我的问题是,我正在将我的数组保存为pd.to_csv,它将数组展平为字符串,而不是pd.to_pickle,它将数组保存为原样。谢谢你的帮助!希望这个问题不再存在:)
literal\u eval
在这里也可以。这两种方法都不适用于OP的实际输入,因为
nan
只会引发
namererror
。(虽然你可以不厌其烦地做一些事情,比如
nan=np.nan;x=eval(s);del-nan
,这似乎很愚蠢……)此外,这给了他一个列表列表,而不是numpy数组。啊,太棒了!这不是最佳解决方案,因为我需要在管道的早期做一些事情。谢谢你的帮助。当我调试真正的问题时,这很好。即使在这种情况下,eval也不安全。谁知道该文件中潜藏着什么呢?当然,如果你正在处理其他人所依赖的某种生产数据库,但是这种使用的评估风险通常被大大夸大了。任何人只要能把恶意的东西放进去,很可能就已经可以直接访问计算机了。@Turksarama这与恶意内容无关。更重要的是,格式错误非常常见,它们通常会发生,引发异常并需要有人手动修复数据库。在引发异常之前,依赖评估可能会导致一些副作用。底线是风险很小,但后果可能很大,因此,只要有更安全的选择,就不应该使用eval。为什么要拆分字符串?OP需要一个数组,而不是一堆数组,并且该数组中没有一行单独是有效的JSON。而
json.load([\n[0,1\n0]\n[0,0\n0]])
将给出与示例相同的结果。
s = '''[[[ nan nan nan]\n [ nan nan\nnan]\n [ nan nan nan]]\n\n [[ 0.005506 0.005506\nnan]\n [ 0.006684 nan nan]\n [ 0.006684 nan\nnan]]\n\n [[ nan nan nan]\n [ nan nan\nnan]\n [ nan nan nan]]]'''

import numpy, json
x = numpy.array(json.loads(','.join(s.split()).replace('[,','[').replace('nan','NaN')))

print(x)

#array([[[      nan,       nan,       nan],
#        [      nan,       nan,       nan],
#        [      nan,       nan,       nan]],
#       [[ 0.005506,  0.005506,       nan],
#        [ 0.006684,       nan,       nan],
#        [ 0.006684,       nan,       nan]],
#       [[      nan,       nan,       nan],
#        [      nan,       nan,       nan],
#        [      nan,       nan,       nan]]])
import json
json.loads('[[0,1,0],[0,0,0]]')