如何在numpy中将字符串数组转换为浮点数数组?

188

如何转换

["1.1", "2.2", "3.2"]

[1.1, 2.2, 3.2]
在NumPy中?
6个回答

260
如果你将数据读入为列表,只需执行np.array(map(float, list_of_strings))(或等价地使用列表推导式)。 (在Python 3中,如果使用map,则需要在map返回值上调用list,因为map现在返回迭代器。)
但是,如果它已经是字符串的numpy数组,则有更好的方法。 使用astype()
import numpy as np
x = np.array(['1.1', '2.2', '3.3'])
y = x.astype(np.float)

如果我有一个包含字符串的数组需要保留,该怎么办?例如 ['a','1.1','2.2','3.3'] -> ['a',1.1,2.2,3.3] - ePascoal
8
使用“列表”(list)代替Numpy数组。 Numpy数组意在采用同种类型的元素。如果你真的想要不同类型的元素,可以使用对象数组(例如:np.array(['apple', 1.2, 1, {'b'=None, 'c'=object()}], dtype=object))。但是,与使用列表相比,对象数组并没有任何显著的优势。 - Joe Kington
print(list(y))输出```[1.1,2.2,3.3][程序已完成]```,按照OP的要求。 - Subham
如果任何一个字符串为空字符串(''),则无法工作。 - germ

20

另一个选项可能是numpy.asarray

import numpy as np
a = ["1.1", "2.2", "3.2"]
b = np.asarray(a, dtype=float)

print(a, type(a), type(a[0]))
print(b, type(b), type(b[0]))

导致:

['1.1', '2.2', '3.2'] <class 'list'> <class 'str'>
[1.1 2.2 3.2] <class 'numpy.ndarray'> <class 'numpy.float64'>

2
我在Python 2.7中对这里所有的答案进行了基准测试。假设我得到一个包含512个字符串的列表,这种方法是最快的(比Pradeep Bisht的答案稍微快一点,比Thomio的答案快1.5倍以上,比被接受的答案快两倍以上)。点个赞! - jodag
3
这里不需要使用"order='C'",因为这是一个一维数组。这行代码(至少在Python 3.6.9中)也可以实现相同效果: b=np.array(a, dtype=float) - DavidS
在编程中,将“.tolist()”添加到末尾,例如“b = np.asarray(d,dtype = np.float64) .tolist()”,以获得逗号分隔的列表。 - Yu Da Chi

7

如果您有(或创建)一个字符串,您可以使用np.fromstring

import numpy as np
x = ["1.1", "2.2", "3.2"]
x = ','.join(x)
x = np.fromstring( x, dtype=np.float, sep=',' )

请注意,x = ','.join(x)会将x数组转换为字符串'1.1, 2.2, 3.2'。如果您从txt文件中读取一行,则每行已经是字符串了。

6
你可以使用 dtype=floatnp.array()
import numpy as np

x = ["1.1", "2.2", "3.2"]
y = np.array(x,dtype=float)

输出:

array([1.1, 2.2, 3.2])

5

您也可以使用这个

import numpy as np
x=np.array(['1.1', '2.2', '3.3'])
x=np.asfarray(x,float)

0
如果您有一个包含无效值的数组,例如空字符串(''),那么直接进行转换会引发错误。如果您只想将这个“有问题”的数组转换为一个numpy浮点数组,并稍后处理无效值,那么pandas包有一个函数(pandas.to_numeric),它将无效值设置为NaN,并将其余部分转换为浮点数。
import pandas as pd

a = np.array(["1.1", "2.2"], float)      # OK

lst = ["1.1", "2.2", "3.2.", ""]
a = np.array(lst, float)                 # ValueError: could not convert string to float: '3.2.'
a = pd.to_numeric(lst, errors='coerce')  # array([1.1, 2.2, nan, nan])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接