我有兩個包含字符串的數組。對於一個數組中的每個字符串,我想檢查它是否以第二個數組中的字符串結尾。numpy vectorized:檢查數組中的字符串是否以另一個數組中的字符串結尾
輸入:
strings = ['val1', 'val2', 'val3']
ends = ['1', '2', 'al1']
希望的輸出:
[[ True, False, True],
[False, True, False],
[False, False, False]]
val1
如在1
以及在al1
結束時,兩個(0,0)和(0,2)爲真。
我有以下工作代碼:
import numpy as np
strings = ['val1', 'val2', 'val3']
ends = ['1', '2', 'al1']
def buildFunction(ending):
return lambda x: x.endswith(ending)
funcs = list(map(buildFunction, ends))
def end_function_vector(val):
return np.vectorize(lambda f, x: f(x))(funcs, np.repeat(val, len(funcs)))
result = np.array(list(map(end_function_vector, strings)))
,並返回所需的輸出。
然而,對於大陣列(〜10 9 輸出元素)中的最後一行的map
花費相當長的一段,因爲np.vectorize
和map
是幾乎圍繞只是一個包裝一個for循環。有誰知道更快,矢量化的方法來做到這一點?
認爲你可以簡單地做:'np.core.defchararray.endswith(A [:,無],B)',我們有一個贏家! – Divakar
很好的實施!它的工作速度比OP的基礎快4到5倍。 –