首页 > 解决方案 > 将带括号的字符串转换为numpy数组

问题描述

问题描述:

我在数据框列中有一个类似数组的结构作为字符串(我从 csv 文件中读取数据框)。

此列的一个字符串元素如下所示:

In  [1]: df.iloc[0]['points']    
Out [2]: '[(-0.0426, -0.7231, -0.4207), (0.2116, -0.1733, -0.1013), (...)]'

所以它实际上是一个类似数组的结构,对我来说它看起来“为 numpy 做好了准备”。

numpy.fromstring()无济于事,因为它不喜欢括号:
将数组的字符串表示形式转换为python中的numpy数组

一个简单numpy.array()的字符串本身,如果我将它复制并粘贴到array()函数中,它会返回一个 numpy 数组。
但是如果我用包含这样的字符串的变量填充array()函数:np.array(df.iloc[0]['points'])它不起作用,给我一个ValueError: could not convert string to float

将字符串转换为numpy数组

问题:

是否有任何功能可以以简单的方式执行此操作(无需替换或正则表达式括号)?

标签: pythonarraysstringpandasnumpy

解决方案


您可以ast.literal_eval在传递给之前使用numpy.array

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 数组。


推荐阅读