将带括号的字符串转换为numpy数组
Posted
技术标签:
【中文标题】将带括号的字符串转换为numpy数组【英文标题】:Convert a string with brackets to numpy array 【发布时间】:2019-01-24 15:45:13 【问题描述】:问题描述:
我在数据框列中有一个类似数组的结构作为字符串(我从 csv 文件中读取数据框)。
此列的一个字符串元素如下所示:
In [1]: df.iloc[0]['points']
Out [2]: '[(-0.0426, -0.7231, -0.4207), (0.2116, -0.1733, -0.1013), (...)]'
所以它实际上是一个类似数组的结构,对我来说它看起来“为 numpy 做好了准备”。
numpy.fromstring()
没有帮助,因为它不喜欢括号:convert string representation of array to numpy array in python
字符串本身上的简单numpy.array()
,如果我将其复制并粘贴到array()
函数中,则会返回一个numpy 数组。
但是如果我用包含这样的字符串的变量填充array()
函数:np.array(df.iloc[0]['points'])
它不起作用,给我一个ValueError: could not convert string to float
Convert string to numpy array
问题:
是否有任何功能可以以简单的方式做到这一点(无需替换或正则表达式括号)?
【问题讨论】:
第一个问题是:这些数据是从哪里来的?这是你正在生成的东西吗?或者某些程序或库生成的东西?如果您可以解决问题,以便以实际需要解析的形式创建数据,或者至少找到确切的格式以及您应该如何使用它的解释,那将比通过猜测进行逆向工程,这样你就可以编写一个 hacky 解析器。 无论如何,这看起来像是有人将元组列表的 repr 写入文件。这是一个非常糟糕的主意,但如果你不能改变它,你可以通过在每个字符串上调用ast.literal_eval
来扭转它。这将适用于您发布的示例,但不能保证它适用于您的所有数据,或者您不会遇到正确序列化数据不存在的浮点舍入问题。这是一种技巧,而不是解决方案。
structured
数组的字符串(打印)表示是一个元组列表。 repr
字符串将包含 dtype
信息。但由于这是 DataFrame 中的一个单元格,因此可能还有其他可能性。您是否从csv
文件中加载了此df
?该文件中是否有这样的引号字符串?
【参考方案1】:
你可以在传递给numpy.array
之前使用ast.literal_eval
:
from ast import literal_eval
import numpy as np
x = '[(-0.0426, -0.7231, -0.4207), (0.2116, -0.1733, -0.1013)]'
res = np.array(literal_eval(x))
print(res)
array([[-0.0426, -0.7231, -0.4207],
[ 0.2116, -0.1733, -0.1013]])
您可以对 Pandas 系列中的字符串执行等效操作,但不清楚是否需要跨行聚合。如果是这种情况,您可以组合使用上述逻辑派生的 NumPy 数组列表。
文档解释了literal_eval
可接受的类型:
安全地评估表达式节点或包含 Python 的字符串 文字或容器显示。提供的字符串或节点只能 由以下 Python 文字结构组成:字符串、字节、 数字、元组、列表、字典、集合、布尔值和
None
。
因此,我们有效地将字符串转换为元组列表,np.array
然后可以将其转换为 NumPy 数组。
【讨论】:
太棒了!我不知道这个模块!literal_eval
正在解析看起来像元组列表的字符串。它处理基本的 Python 结构。 JSON
做了类似的事情,但语法更受限制。以上是关于将带括号的字符串转换为numpy数组的主要内容,如果未能解决你的问题,请参考以下文章