У меня есть два целочисленных массива, которые я хочу объединить для каждого элемента в один массив строк вида '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
очень длинные, и это слишком медленно.Есть ли способ сделать это через пустые звонки?Что-то, что hstack
-иш?Я могу получить это далеко:
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
(кажется стабильным):
