Python 将numpy数组从object dtype转换为float

Python 将numpy数组从object dtype转换为float,python,numpy,Python,Numpy,我如何转换福勒。从对象数据类型到浮点的numpy: array(['4,364,541', '2,330,200', '2,107,648', '1,525,711', '1,485,231', '1,257,500', '1,098,200', '1,065,106', '962,100', '920,200', '124,204', '122,320', '119,742', '116,627', '115,900', '108,400', '108

我如何转换福勒。从对象数据类型到浮点的numpy:

array(['4,364,541', '2,330,200', '2,107,648', '1,525,711', '1,485,231',
       '1,257,500', '1,098,200', '1,065,106', '962,100', '920,200',
       '124,204', '122,320', '119,742', '116,627', '115,900', '108,400',
       '108,400', '108,000', '103,795', '102,900', '101,845', '100,900',
       '100,626'], dtype=object)

我尝试了
arr.astype(float)
,但由于每个字符串中都有
,所以这不起作用。

简单的方法是删除每个逗号:

np.array([v.replace(',', '') for v in arr], dtype=np.float32)
如果您有熊猫,
到_numeric
是一个不错的选择。它优雅地处理任何可能在替换后爬行的无效值

pd.to_numeric([v.replace(',', '') for v in arr], errors='coerce',  downcast='float')

这两种方法都将浮点数组作为输出返回。

简单的方法是删除每个逗号:

np.array([v.replace(',', '') for v in arr], dtype=np.float32)
如果您有熊猫,
到_numeric
是一个不错的选择。它优雅地处理任何可能在替换后爬行的无效值

pd.to_numeric([v.replace(',', '') for v in arr], errors='coerce',  downcast='float')
这两种方法都将浮点数组作为输出返回。

给定:

>>> ar
array(['4,364,541', '2,330,200', '2,107,648', '1,525,711', '1,485,231',
       '1,257,500', '1,098,200', '1,065,106', '962,100', '920,200',
       '124,204', '122,320', '119,742', '116,627', '115,900', '108,400',
       '108,400', '108,000', '103,795', '102,900', '101,845', '100,900',
       '100,626'], dtype=object)
您可以使用
filter
删除所有非数字元素并创建浮动:

>>> np.array(list(map(float, (''.join(filter(lambda c: c.isdigit(), s)) for s in ar))))
array([4364541., 2330200., 2107648., 1525711., 1485231., 1257500.,
       1098200., 1065106.,  962100.,  920200.,  124204.,  122320.,
        119742.,  116627.,  115900.,  108400.,  108400.,  108000.,
        103795.,  102900.,  101845.,  100900.,  100626.])
鉴于:

您可以使用
filter
删除所有非数字元素并创建浮动:

>>> np.array(list(map(float, (''.join(filter(lambda c: c.isdigit(), s)) for s in ar))))
array([4364541., 2330200., 2107648., 1525711., 1485231., 1257500.,
       1098200., 1065106.,  962100.,  920200.,  124204.,  122320.,
        119742.,  116627.,  115900.,  108400.,  108400.,  108000.,
        103795.,  102900.,  101845.,  100900.,  100626.])
也可以使用

np.char.替换Cold注释中所述的
。当然,

如果是对象类型

replace(a.astype(np.unicode_), ',','').astype(np.float)
也可以使用

np.char.替换Cold注释中所述的
。当然,

如果是对象类型

replace(a.astype(np.unicode_), ',','').astype(np.float)
另一种方式

np.frompyfunc(lambda x: x.replace(',',''),1,1)(arr).astype(float)
frompyfunc
返回一个对象数据类型数组,在本例中可以。我经常发现,它比列表理解快2倍,但在这里,它的速度与
@coldspeed的
:

np.array([v.replace(',', '') for v in arr], dtype=np.float32)
这可能是因为我们从对象数据类型数组开始。对象数据类型上的直接迭代比列表上的迭代慢一点,但比常规numpy数组上的迭代快一点。与列表一样,数组的元素是指向字符串的指针,不需要字符串数据类型数组所需的“取消装箱”

(比
np.char
版本快2到3倍)。

另一种方法

np.frompyfunc(lambda x: x.replace(',',''),1,1)(arr).astype(float)
frompyfunc
返回一个对象数据类型数组,在本例中可以。我经常发现,它比列表理解快2倍,但在这里,它的速度与
@coldspeed的
:

np.array([v.replace(',', '') for v in arr], dtype=np.float32)
这可能是因为我们从对象数据类型数组开始。对象数据类型上的直接迭代比列表上的迭代慢一点,但比常规numpy数组上的迭代快一点。与列表一样,数组的元素是指向字符串的指针,不需要字符串数据类型数组所需的“取消装箱”


(比
np.char
版本快2到3倍)。

一个较短的别名:
np.char.replace
也会做同样的事情。@coldspeed很好的注释,这是一个冗长的包名;)如果
arr
object
dtype,则这将不起作用。首先必须将其转换为字符串数据类型。
char
函数基本上迭代字符串数据类型的元素并应用相应的字符串方法。我猜速度将类似于在对象数据类型数组上迭代。一个较短的别名:
np.char.replace
也会做同样的事情。@coldspeed nice remark,这是一个冗长的包名;)如果
arr
object
dtype,则这将不起作用。首先必须将其转换为字符串数据类型。
char
函数基本上迭代字符串数据类型的元素并应用相应的字符串方法。我猜速度将类似于在对象数据类型数组上迭代。