[英]Vectorizing string formatting across NumPy array
我有兩個整數數組,每個元素都想組合成形式為'a[i]_b[i]'
的單個字符串數組。 也就是說,我有
import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
我想獲得數組
result = np.array(['1_4', '2_5', '3_6'])
我可以通過列表理解輕松地做到這一點:
result = np.array(['{}_{}'.format(a[i], b[i]) for i in range(len(a))])
但是我的數組a
和b
很長,而且速度太慢。 有沒有辦法通過numpy調用來做到這一點? 是hstack
-ish嗎? 我可以做到這一點:
result np.hstack([a.resahpe(len(a), 1), b.reshape(len(b), 1)])
這給了我
np.array([[1, 4]
[2, 5]
[3, 6]])
當然,必須有一種簡單的方法可以使我從這里得到想要的結果...
編輯:
使用defchararray
兩個調用似乎比列表理解要慢,但是frompyfunc
很有效...
>>> import timeit
>>> t = Timer("""['{}_{}'.format(a[i], b[i]) for i in range(len(b))]""", setup="""import numpy as np; a = np.random.randn(10000); b=np.random.randn(10000)""")
>>> t.timeit(1000)
22.310123541974463
>>> t2 = Timer("""np.core.defchararray.add(np.core.defchararray.add(a.astype(str),'_'), b.astype(str))""", setup="""import numpy as np; a = np.random.randn(10000); b=np.random.randn(10000)""")
>>> t2.timeit(1000)
28.489826270961203
>>> t3 = Timer("""fv(a,b)""", setup='import numpy as np; a = np.random.randn(10000); b=np.random.randn(10000); fv = np.frompyfunc("{}_{}".format, 2, 1)')
>>> t3.timeit(1000)
15.455791965010576
這是a
和b
的長度的函數(似乎穩定):
fv = np.frompyfunc("{}_{}".format, 2, 1)
result = fv(a, b) # array(['1_4', '2_5', '3_6'], dtype=object)
基於某個時間,這大約是列表理解和轉換為np.array的運行時間的1/3。
In [2]: a = np.arange(100000)
In [3]: b = np.arange(100000) + a.size
In [4]: fv = np.frompyfunc("{}_{}".format, 2, 1)
In [5]: def f(a, b): return np.array(["{}_{}".format(a,b) for a,b in zip(a,b)], dtype=object)
In [6]: %timeit f(a,b)
370 ms ± 12.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [7]: %timeit fv(a,b)
137 ms ± 1.48 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
您可以使用defchararray.add
import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = np.core.defchararray.add(a.astype(str),'_')
c = np.core.defchararray.add(c,b.astype(str))
print(c) #['1_4' '2_5' '3_6']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.