将numpy数组从对象dtype转换为float

时间:2018-07-28 23:25:08

标签: python numpy

如何转换foll。从对象dtype到浮点的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),但是由于每个字符串中都有,,所以无法正常工作。

4 个答案:

答案 0 :(得分:2)

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

np.array([v.replace(',', '') for v in arr], dtype=np.float32)

如果您有熊猫,to_numeric是一个不错的选择。它可以很好地处理替换后可能出现的所有无效值。

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

这两个方法都将float数组作为输出。

答案 1 :(得分:2)

另一种方式

np.frompyfunc(lambda x: x.replace(',',''),1,1)(arr).astype(float)

frompyfunc返回一个对象dtype数组,在这种情况下可以使用。通常,我发现它比列表理解要快2倍,但在这里它的时间与@coldspeed's相同:

np.array([v.replace(',', '') for v in arr], dtype=np.float32)

那可能是因为我们从对象dtype数组开始。对象dtype上的直接迭代比列表上的迭代慢一些,但比常规numpy数组上的迭代快。就像列表一样,数组的元素是指向字符串的指针,不需要像字符串dtype数组那样的“拆箱”。

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

答案 2 :(得分:1)

给出:

>>> 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.])

答案 3 :(得分:1)

也可以使用numpy.core.defchararray.replace()

>>> numpy.core.defchararray.replace(arr, ',','').astype(np.float)

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.replace,如Cold的评论中所述。当然,这个package provides is built for arrays of type numpy.string_ or numpy.unicode_

如果是对象类型,

replace(a.astype(np.unicode_), ',','').astype(np.float)