我有一个具有以下结构的字符串:
{0: [array([5.1, 3.5, 1.4, 0.2]), array([4.9, 3. , 1.4, 0.2]), 1: [array([7. , 3.2, 4.7, 1.4]), array([6.4, 3.2, 4.5, 1.5]), 2: [array([6.3, 3.3, 6. , 2.5]), array([7.1, 3. , 5.9, 2.1])]}
它是包含 numpy 数组的 python 字典的形式。 如何将此字符串转换为包含 numpy 数组的 python 字典?
感谢您的回复。我不能简单地更改字符串,因为该字符串是我想通过管道传输到另一个文件的 python 文件的输出。我可以去更改此输出的格式,但我更希望避免这种情况。
答案 0 :(得分:0)
在交互式 ipython
会话中创建一个别名:
在 [7] 中:array = np.array
并编辑了您的样本的复制粘贴。我不得不添加几个结束 ]
:
In [8]: data = {0: [array([5.1, 3.5, 1.4, 0.2]), array([4.9, 3. , 1.4, 0.2])], 1
...: : [array([7. , 3.2, 4.7, 1.4]), array([6.4, 3.2, 4.5, 1.5])], 2: [array(
...: [6.3, 3.3, 6. , 2.5]), array([7.1, 3. , 5.9, 2.1])]}
现在一个简单的执行工作:
In [9]: data
Out[9]:
{0: [array([5.1, 3.5, 1.4, 0.2]), array([4.9, 3. , 1.4, 0.2])],
1: [array([7. , 3.2, 4.7, 1.4]), array([6.4, 3.2, 4.5, 1.5])],
2: [array([6.3, 3.3, 6. , 2.5]), array([7.1, 3. , 5.9, 2.1])]}
或带有字符串(已更正):
In [10]: astr="{0: [array([5.1, 3.5, 1.4, 0.2]), array([4.9, 3. , 1.4, 0.2])], 1
...: : [array([7. , 3.2, 4.7, 1.4]), array([6.4, 3.2, 4.5, 1.5])], 2: [array
...: ([6.3, 3.3, 6. , 2.5]), array([7.1, 3. , 5.9, 2.1])]}"
In [11]: astr
Out[11]: '{0: [array([5.1, 3.5, 1.4, 0.2]), array([4.9, 3. , 1.4, 0.2])], 1: [array([7. , 3.2, 4.7, 1.4]), array([6.4, 3.2, 4.5, 1.5])], 2: [array([6.3, 3.3, 6. , 2.5]), array([7.1, 3. , 5.9, 2.1])]}'
我可以执行 exec
或 eval
:
In [15]: eval(astr)
Out[15]:
{0: [array([5.1, 3.5, 1.4, 0.2]), array([4.9, 3. , 1.4, 0.2])],
1: [array([7. , 3.2, 4.7, 1.4]), array([6.4, 3.2, 4.5, 1.5])],
2: [array([6.3, 3.3, 6. , 2.5]), array([7.1, 3. , 5.9, 2.1])]}
通常不鼓励使用 eval
,因为它可能被黑客入侵。但是更安全的 ast_eval
只适用于字典、列表和元组,而不适用于 np.array
。您必须以一种或多种方式编辑字符串,使其成为有效的 Python/numpy 表达式。
答案 1 :(得分:0)
我更改了字符串的生成方式,使其采用包含 python 列表而不是 numpy 数组的字典形式。
有了这个,我就可以使用 ast.literal_eval()
来反序列化它。