将带括号的字符串转换为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数组的主要内容,如果未能解决你的问题,请参考以下文章

将 numpy 数组转换为 CSV 字符串,将 CSV 字符串转换回 numpy 数组

将字符串转换为numpy数组

将浮点 numpy 数组转换为字符串数组 Python

将列表列表的字符串转换为 Numpy 数组

在numpy中将int数组转换为字符串数组而不截断

如何将numpy字符串数组转换为numpy数组,以使用MultiLabelBinarizer?