У меня есть два массива, содержащие строки. Для каждой строки в одном массиве я хочу проверить, заканчивается ли она строками во втором массиве.
Вход:
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)))
И он возвращает желаемый результат.
Однако для больших массивов (~109 выходных элементов) map
в последней строке занимает довольно много времени, поскольку np.vectorize
и map
в значительной степени являются просто оболочкой цикла for. Кто-нибудь знает более быстрый векторный метод для этого?