我有一个元组(h),如下所示:
(array([[145, 34, 26, 18, 90, 89],
[ 86, 141, 216, 167, 67, 214],
[ 18, 0, 212, 49, 232, 34],
...,
[147, 99, 73, 110, 108, 9],
[222, 133, 231, 48, 227, 154],
[184, 133, 169, 201, 162, 168]], dtype=uint8), array([[178, 58, 24, 90],
[ 3, 31, 129, 243],
[ 48, 92, 19, 108],
...,
[148, 21, 25, 209],
[189, 114, 46, 218],
[ 15, 43, 92, 61]], dtype=uint8), array([[ 17, 254, 216, ..., 126, 74, 129],
[231, 168, 214, ..., 131, 50, 107],
[ 77, 185, 229, ..., 86, 167, 61],
...,
[105, 240, 95, ..., 230, 158, 27],
[211, 46, 193, ..., 48, 57, 79],
[136, 126, 235, ..., 109, 33, 185]], dtype=uint8))
我将其转换为字符串s = str(h):
'(array([[ 1, 60, 249, 162, 51, 3],\n [ 57, 76, 193, 244, 17, 238],\n [ 22, 72, 101, 229, 185, 124],\n ...,\n [132, 243, 123, 192, 152, 107],\n [163, 187, 131, 47, 253, 155],\n [ 21, 3, 77, 208, 229, 15]], dtype=uint8), array([[119, 149, 215, 129],\n [146, 71, 121, 79],\n [114, 148, 121, 140],\n ...,\n [175, 121, 81, 71],\n [178, 92, 1, 99],\n [ 80, 122, 189, 209]], dtype=uint8), array([[ 26, 122, 248, ..., 104, 167, 29],\n [ 41, 213, 250, ..., 82, 71, 211],\n [ 20, 122, 4, ..., 152, 99, 121],\n ...,\n [133, 77, 84, ..., 238, 243, 240],\n [208, 183, 187, ..., 182, 51, 116],\n [ 19, 135, 48, ..., 210, 163, 58]], dtype=uint8))'
现在,我想将s转换回元组。我尝试使用ast.literal_eval(s),但出现以下错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.5/ast.py", line 84, in literal_eval
return _convert(node_or_string)
File "/usr/lib/python3.5/ast.py", line 55, in _convert
return tuple(map(_convert, node.elts))
File "/usr/lib/python3.5/ast.py", line 83, in _convert
raise ValueError('malformed node or string: ' + repr(node))
ValueError: malformed node or string: <_ast.Call object at 0x76a6f770>
我在任何地方都找不到这个确切的解决方案。如果有人可以帮助我,那就太好了。
答案 0 :(得分:0)
您不能在numpy数组(用元组或其他方式包装)上使用str()
,并希望恢复数据。
首先,ast.literal_eval()
函数仅支持literals和literal displays,而不支持numpy array(...)
语法。
接下来,在元组上的str()
会生成易于调试的输出;元组未实现__str__
字符串转换挂钩,因此将返回其repr()
表示形式。 Numpy数组确实支持str()
转换,但是它们的输出仍然是一个看起来很友好的字符串,它忽略了实际值的很多细节。在您的示例中,那些...
ellipsis dots表示数组的该部分中还有更多数据,但是字符串不包括那些值。因此,如果您要尝试以此重新创建阵列,则会丢失数据。
如果您需要将这些元组存储在文件或数据库列中,或者需要通过网络连接传输它们,则需要序列化数据。正确的序列化将保留阵列的每个细节。
对于具有numpy数组的元组,可以使用pickle.dumps()
生成bytes
对象,该对象可以传递回pickles.loads()
以重新创建相同的值。
您还可以将单个numpy数组转换为特定于numpy的二进制格式,并使用numpy.save()
and numpy.load()
functions(直接在文件上运行,但可以传入io.BytesIO()
objects)再次加载该格式。