Элементная конкатенация строк в numpy
это ошибка?
import numpy as np
a1=np.array(['a','b'])
a2=np.array(['E','F'])
In [20]: add(a1,a2)
Out[20]: NotImplemented
Я пытаюсь выполнить конкатенацию строк по элементам. Я думал, что Add () - это способ сделать это в numpy, но, очевидно, он работает не так, как ожидалось.
5 ответов
Это можно сделать с помощью и NumPy.ядро.дефчараррей.добавить. Вот пример:
>>> import numpy as np
>>> a1 = np.array(['a', 'b'])
>>> a2 = np.array(['E', 'F'])
>>> np.core.defchararray.add(a1, a2)
array(['aE', 'bF'],
dtype='<U2')
есть и другие полезные строковые операции доступно для типов данных NumPy.
можно использовать chararray
подкласс для выполнения операций массива со строками:
a1 = np.char.array(['a', 'b'])
a2 = np.char.array(['E', 'F'])
a1 + a2
#chararray(['aE', 'bF'], dtype='|S2')
еще один интересный пример:
b = np.array([2, 4])
a1*b
#chararray(['aa', 'bbbb'], dtype='|S4')
Это может (и должно) быть сделано на чистом Python, как numpy
также использует функции манипуляции строками Python внутренне:
>>> a1 = ['a','b']
>>> a2 = ['E','F']
>>> map(''.join, zip(a1, a2))
['aE', 'bF']
другое решение-преобразовать строковые массивы в массивы python объектов так, чтобы str.добавить называется:
>>> import numpy as np
>>> a = np.array(['a', 'b', 'c', 'd'], dtype=np.object)
>>> print a+a
array(['aa', 'bb', 'cc', 'dd'], dtype=object)
Это не так медленно (менее чем в два раза медленнее, чем добавление целых массивов).
еще одно основное, элегантное и быстрое решение:
In [11]: np.array([x1 + x2 for x1,x2 in zip(a1,a2)])
Out[11]: array(['aE', 'bF'], dtype='<U2')
Это очень быстро для небольших массивов.
In [12]: %timeit np.array([x1 + x2 for x1,x2 in zip(a1,a2)])
3.67 µs ± 136 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [13]: %timeit np.core.defchararray.add(a1, a2)
6.27 µs ± 28.3 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [14]: %timeit np.char.array(a1) + np.char.array(a2)
22.1 µs ± 319 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
для больших массивов разница во времени невелика.
In [15]: b1 = np.full(10000,'a')
In [16]: b2 = np.full(10000,'b')
In [189]: %timeit np.array([x1 + x2 for x1,x2 in zip(b1,b2)])
6.74 ms ± 66.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [188]: %timeit np.core.defchararray.add(b1, b2)
7.03 ms ± 419 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [187]: %timeit np.char.array(b1) + np.char.array(b2)
6.97 ms ± 284 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)