将 dtype <U30 的 numpy ndarray 转换为 float

Posted

技术标签:

【中文标题】将 dtype <U30 的 numpy ndarray 转换为 float【英文标题】:Converting numpy ndarray with dtype <U30 into float 【发布时间】:2019-02-16 04:59:12 【问题描述】:

我正在从 pandas 数据框单元格中读取一个列表。

>>from pandas import DataFrame as table
>>x = table.loc[table['person'] == int(123), table.columns != 'xyz']['segment'][0]
>>print("X = ",x)

“person”和“segment”是我的列名,segment 包含一个带有浮动值的列表。

>>X = [[39.414, 39.498000000000005]]

现在,当我尝试将其转换为 numpy 数组时,

>>x = numpy.asarray(x)
>>x=x.astype(float)

我收到以下错误

ValueError: could not convert string to float: '[[39.414, 39.498000000000005]]'

我已尝试解析字符串并尝试删除任何“\n”或“”或任何不必要的引号,但它不起作用。然后我试图找到dtype

>>print("Dtype = ", x.dtype)
>>Dtype = <U30

我假设我们需要将 U30 dtype 转换为浮点数,但我不知道该怎么做。我正在使用 numpy 版本 1.15.0。

我想要做的就是,将上面的列表解析成一个带有浮点值的列表。

【问题讨论】:

你能添加一些模拟数据以便重现吗? 看起来你有一个列表的字符串表示。首先尝试使用ast.literal_eval(x)。在整个列上执行此操作以使这更容易:df.segment = df.segment.apply(ast.literal_eval) 【参考方案1】:

数据类型应该已经提示您了。 U30 这里代表一个长度为 30 的 unicode 字符串(如果你输入 len(x),你会看到它。

您拥有的是列表的字符串表示形式,而不是字符串/浮点数/等的列表。

您需要在这里使用ast 库:

x = '[[39.414, 39.498000000000005]]'
x = ast.literal_eval(x)
np.array(x, dtype=float)

array([[39.414, 39.498]])

【讨论】:

【参考方案2】:

对于您看到的具体格式,请考虑np.fromstring。通过字符串切片,您还可以删除未使用的维度:

x = '[[39.414, 39.498000000000005]]'

res = np.fromstring(x[2:-2], sep=',')

# array([ 39.414,  39.498])

【讨论】:

嗨!这适用于上述示例,但不适用于像这样的多维数组:x = '[[39.414, 39.498000000000005],[344.234234,442.23432]]'。在那种情况下 x = ast.literal_eval(x) 后跟 np.array(x, dtype=float) 更合适 @appsdownload,是的,因此评论For the specific format you see 哦。谢谢@jpp。另外,如果我有特定的格式,你能帮我理解哪一个会更有效吗? 我不确定。这是一个单独的问题,但请查看 timeit 模块,您可以自己测试!

以上是关于将 dtype <U30 的 numpy ndarray 转换为 float的主要内容,如果未能解决你的问题,请参考以下文章

genfromtxt() 中的 NumPy dtype 问题,将字符串读取为字节串

通过 SWIG 将简单的 numpy 数组传递给 C

('试图更新一个张量', <tf.Tensor: shape=(), dtype=float32, numpy=3.0>)

numpy.load 给出 ValueError: descr is not a valid dtype 描述符:

将 numpy dtypes 转换为原生 python 类型

将 numpy 指针 (dtype=np.bool) 传递给 C++