将Python中表示数组的字符串转换为Numpy数组

22

我可以使用ast.literal_eval将列表的字符串表示转换为列表(参考链接)。是否有相应的方法可以将numpy数组的字符串表示转换为数组?

x = arange(4)
xs = str(x)
xs
'[0 1 2 3]'
# how do I convert xs back to an array

使用 ast.literal_eval(xs) 会引发 SyntaxError。如果需要,我可以进行字符串解析,但我认为可能有更好的解决方案。

NumPy数组不提供可用于重建Python列表的“repr”。您可以修改字符串以重新创建列表,然后从中创建NumPy数组,例如numpy.array(ast.literal_eval(', '.join(xs.split(' ')))) - Paul Rooney
你是否必须使用ast.literal_eval?如果是,那么答案是否定的,你无法从literal_eval中获取numpy数组。根据Python文档中对ast.literal_eval(node_or_string)的描述:“提供的字符串或节点只能由以下Python文字结构组成:字符串、数字、元组、列表、字典、布尔值和None。”如果你真正想要的是一种方便的方法将numpy数组转换为字符串,然后再转回数组,请在问题中详细说明。 - Warren Weckesser
抱歉没有表达清楚。我想知道是否有类似于ast.literal_eval的模块可以用于numpy数组,但并不打算使用ast.literal_eval - jdmcbr
4个回答

21
对于一维数组,Numpy有一个名为fromstring的函数,因此可以在没有额外库的情况下高效地完成。
简而言之,您可以像这样解析字符串:
s = '[0 1 2 3]'
a = np.fromstring(s[1:-1], dtype=np.int, sep=' ')
print(a) # [0 1 2 3]

对于n维数组,可以使用.replace()去掉方括号,.reshape()调整为所需形状,或者使用Merlin的解决方案。

18

试试这个:

xs = '[0 1 2 3]'

import re, ast
ls = re.sub('\s+', ',', xs)
a = np.array(ast.literal_eval(ls))
a  # -> array([0, 1, 2, 3])    

我认为其他答案更好地回答了我的问题,是的。我无法理解你为什么要问这个问题。在我接受答案之前,你已经清楚地回答了。 - jdmcbr
3
原因很简单。给出的代码示例不能奏效! - Merlin
这是一个自包含的示例,非常清楚地说明了如何使用np.fromstring函数来解决我尝试解决的问题,这是我忘记的一个函数。我在我的问题中还说过:“如果需要,我可以进行字符串解析”。所以我没有从你的答案中学到任何东西,但我从另一个答案中学到了一些东西。 - jdmcbr
1
我在这里完成了。学到了东西就点赞,在SO上回答被标记为正确的也是如此。选择的答案将会误导未来的人们。 - Merlin
1
两个答案都是有效的,具体情况而定,对于像我这样的未来读者,两者都有益处。给两个答案点赞。 - ntg
这个解决方案也适用于由str()编码的2D数组,因此它确实应该被标记为答案。 - Hackless

4
使用np.matrix将字符串转换为numpy矩阵。然后,使用np.asarray将矩阵转换为具有相同形状的numpy数组。
>>> s = "[1,2]; [3,4]"
>>> a = np.asarray(np.matrix(s)) 
>>> a
array([[1, 2],
       [3, 4]])

与被接受的答案相反,这也适用于二维数组。

1
这应该是被接受的答案。它解决了许多问题! - Yahya

0

如果列表元素是二维浮点数,那么 ast.literal_eval() 就无法处理嵌套列表的非常复杂的大量列表。

因此,最好将列表视为字典进行解析,并将字符串转储。

在加载保存的转储时,ast.literal_eval() 更好地处理字符串字典。将字符串转换为字典,然后再将其转换为列表。

k = np.array([[[0.09898942, 0.22804536],[0.06109612, 0.19022354],[0.93369348, 0.53521671],[0.64630094, 0.28553219]],[[0.94503154, 0.82639528],[0.07503319, 0.80149062],[0.1234832 , 0.44657691],[0.7781163 , 0.63538195]]])

d = dict(enumerate(k.flatten(), 1))
d = str(d) ## dump as string  (pickle and other packages parse the dump as bytes)

m = ast.literal_eval(d) ### convert the dict as str to  dict

m = np.fromiter(m.values(), dtype=float) ## convert m to nparray


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接