将字符串评估为 numpy 数组

问题描述 投票:0回答:3

我的团队正在从 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('][', '],[')+']')])

是否有更好(更安全?)的方式来实现这种转换?我知道首先正确读取数据会更好,但现在我正在寻找一种将输出字符串转换为实际数字的可靠方法。

python list-comprehension eval
3个回答
0
投票

您可以使用

'[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.]])

0
投票

可以使用

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('][', '],[')+']'))

0
投票

没有任何额外的库,但有字符串预处理。 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)
© www.soinside.com 2019 - 2024. All rights reserved.