我的团队正在从 Clickhouse 迁移到 Azure Data Explorer (ADX)。我们目前在从 ADX 查询数据时遇到困难:查询的值是正确的,但数据被读取为 string 而不是 floats 数组。
这是一个示例字符串:
mydummystring='[1.0,2.0,3.0][4.0,5.0,6.0][6.0,7.0,8.0]'
为了将此字符串转换为 numpy 数组,我发现了基于列表理解的解决方法(受 this SO post 启发):
import numpy as np
mynumpyarray = np.array([np.array(x) for x in eval('['+mydummystring.replace('][', '],[')+']')])
是否有更好(更安全?)的方式来实现这种转换?我知道首先正确读取数据会更好,但现在我正在寻找一种将输出字符串转换为实际数字的可靠方法。
您可以使用
'[1.0,2.0,3.0][4.0,5.0,6.0][6.0,7.0,8.0]'
将'[[1.0,2.0,3.0],[4.0,5.0,6.0],[6.0,7.0,8.0]]'
转换为str.replace
使用ast.literal_eval
.
import ast
mydummystring = '[1.0,2.0,3.0][4.0,5.0,6.0][6.0,7.0,8.0]'
mydummystring = '[' + mydummystring.replace('][', '],[') + ']'
mydummystring = ast.literal_eval(mydummystring)
arr = np.array(mydummystring)
print(arr)
json.loads
:
import json
mydummystring = '[1.0,2.0,3.0][4.0,5.0,6.0][6.0,7.0,8.0]'
mydummystring = '[' + mydummystring.replace('][', '],[') + ']'
mydummystring = json.loads(mydummystring)
arr = np.array(mydummystring)
print(arr)
array([[1., 2., 3.],
[4., 5., 6.],
[6., 7., 8.]])
ast.literal_eval
,只解析Python字面量结构,不运行任意代码。
from ast import literal_eval
s = '[1.0,2.0,3.0][4.0,5.0,6.0][6.0,7.0,8.0]'
np_arr = np.array([np.array(x) for x in literal_eval('['+s.replace('][', '],[')+']')])
请注意,创建 NumPy 数组不需要列表理解。
np.array(literal_eval('['+s.replace('][', '],[')+']'))
没有任何额外的库,但有字符串预处理。 np.fromstring 返回一个 1 维 数组,所以找到形状,使其变平然后重塑。
s = '[1.0,2.0,3.0][4.0,5.0,6.0][6.0,7.0,8.0]'
shape = s.count('['), len(s[1:].partition(']')[0].split(','))
# flat array format
s = s.replace('][', ',').strip('][')
a = np.fromstring(s, sep=',', dtype=float).reshape(shape)