簡體   English   中英

將numpy數組從對象dtype轉換為float

[英]convert numpy array from object dtype to float

如何轉換foll。 numpy從對象dtype到float:

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)

如果您有熊貓, to_numeric是一個不錯的選擇。 它可以優雅地處理在替換后可能出現的所有無效值。

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

兩種方法都返回一個float數組作為輸出。

另一種方式

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

frompyfunc返回一個對象frompyfunc數組,在這種情況下可以使用。 通常,我發現它比列表理解要快2倍,但在這里它的時間與@coldspeed's

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

那可能是因為我們從對象dtype數組開始。 對象dtype上的直接迭代比列表上的迭代慢一些,但比常規numpy數組上的迭代快。 就像列表一樣,數組的元素是指向字符串的指針,不需要像字符串dtype數組那樣的“拆箱”。

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

鑒於:

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

也可以使用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.])

或如Cold的評論中所述的np.char.replace 自然,此包提供了為numpy.string_numpy.unicode_類型的數組numpy.unicode_

如果是對象類型

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM