我有一個字符串,如下所示:以分隔符分隔字符串轉換有效的方式來numpy的陣列
1|234|4456|789
我必須把它轉換成numpy的array.I想知道最有效的way.Since我會調用這個函數超過5000萬次!
我有一個字符串,如下所示:以分隔符分隔字符串轉換有效的方式來numpy的陣列
1|234|4456|789
我必須把它轉換成numpy的array.I想知道最有效的way.Since我會調用這個函數超過5000萬次!
的最快方式是使用numpy.fromstring方法:
>>> import numpy
>>> data = "1|234|4456|789"
>>> numpy.fromstring(data, dtype=int, sep="|")
array([ 1, 234, 4456, 789])
試試這個:
import numpy as np
s = '1|234|4456|789'
array = np.array([int(x) for x in s.split('|')])
...假設數字都是整數。如果不是,則在上面的代碼片段中將int
替換爲float
。
EDIT 1:
另外,也可以做到這一點,這隻會造成一個中間列表(一個由split()
生成):
array = np.array(s.split('|'), dtype=int)
編輯2:
另一種方式,可能更快(感謝所有的評論,傢伙!):
array = np.fromiter(s.split("|"), dtype=int)
與此我的問題的NumPy的陣列它會生成一個字符串中所有部分的內存列表。如果真的有五千萬個零件,那麼對於一個臨時列表來說,這是很多額外的內存。 – 2012-03-22 03:15:35
@AdamMihalcin確實取決於正在使用的Python版本。在Python 3中,該列表將被懶惰地評估,並且不會創建中間列表。另外,OP表示該功能將被稱爲5000萬次,而不是列表中有5000萬個元素。 – 2012-03-22 03:19:54
@AdamMihalcin即使你使用'imap'或者一個生成器表達式?奧斯卡 - 在Python 3上,列表理解仍然會創建一箇中間列表。 – agf 2012-03-22 03:20:01
@jterrace勝一(1)網絡連接。
在下面的測量中,縮短了示例代碼,以便在可能的情況下使測試適合一條線而不滾動。
對於那些不熟悉timeit
the -s
flag allows you to specify a bit of code which will only be executed once。
最快和最不雜亂的方法是使用如numpy.fromstring
建議jterrace:
python -mtimeit -s"import numpy;s='1|2'" "numpy.fromstring(s,dtype=int,sep='|')"
100000 loops, best of 3: 1.85 usec per loop
以下三個示例結合使用string.split
與另一工具。
string.split
與numpy.fromiter
python -mtimeit -s"import numpy;s='1|2'" "numpy.fromiter(s.split('|'),dtype=int)"
100000 loops, best of 3: 2.24 usec per loop
string.split
與int()
經由發電機表達鑄造
python -mtimeit -s"import numpy;s='1|2'" "numpy.array(int(x) for x in s.split('|'))"
100000 loops, best of 3: 3.12 usec per loop
string.split
類型int
python -mtimeit -s"import numpy;s='1|2'" "numpy.array(s.split('|'),dtype=int)"
100000 loops, best of 3: 9.22 usec per loop
+1我喜歡贏得互聯網:) – jterrace 2012-03-22 04:21:25
速度差異更好的解釋! – 2013-02-07 16:52:11
+1:絕對是最快的呢。 – DSM 2012-03-22 03:46:24
爲什麼我沒有想到..:P – wim 2012-03-22 04:06:28
非常感謝。..從@bernie時間計算非常高效.. :) – 2012-03-22 14:45:04