我可以使用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
。如果需要,我可以进行字符串解析,但我认为可能有更好的解决方案。fromstring
的函数,因此可以在没有额外库的情况下高效地完成。s = '[0 1 2 3]'
a = np.fromstring(s[1:-1], dtype=np.int, sep=' ')
print(a) # [0 1 2 3]
.replace()
去掉方括号,.reshape()
调整为所需形状,或者使用Merlin的解决方案。试试这个:
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])
np.fromstring
函数来解决我尝试解决的问题,这是我忘记的一个函数。我在我的问题中还说过:“如果需要,我可以进行字符串解析”。所以我没有从你的答案中学到任何东西,但我从另一个答案中学到了一些东西。 - jdmcbrnp.matrix
将字符串转换为numpy矩阵。然后,使用np.asarray
将矩阵转换为具有相同形状的numpy数组。>>> s = "[1,2]; [3,4]"
>>> a = np.asarray(np.matrix(s))
>>> a
array([[1, 2],
[3, 4]])
如果列表元素是二维浮点数,那么 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
numpy.array(ast.literal_eval(', '.join(xs.split(' '))))
。 - Paul Rooneyast.literal_eval
?如果是,那么答案是否定的,你无法从literal_eval
中获取numpy数组。根据Python文档中对ast.literal_eval(node_or_string)
的描述:“提供的字符串或节点只能由以下Python文字结构组成:字符串、数字、元组、列表、字典、布尔值和None。”如果你真正想要的是一种方便的方法将numpy数组转换为字符串,然后再转回数组,请在问题中详细说明。 - Warren Weckesserast.literal_eval
的模块可以用于numpy数组,但并不打算使用ast.literal_eval
。 - jdmcbr