这是一个错误吗?
import numpy as np a1=np.array(['a','b']) a2=np.array(['E','F']) In [20]: add(a1,a2) Out[20]: NotImplemented
我正在尝试做元素级的字符串连接。我认为Add()是在numpy中完成它的方法,但显然它没有像预期的那样工作。
vbopmzt11#
这可以使用numpy.core.defchararray.add来完成。下面是一个示例:
>>> 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数据类型还有其他有用的string operations。
e5njpo682#
You can use the chararray subclass对字符串执行数组操作:
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')
6psbrbz93#
这可以(也应该)在纯Python中完成,因为numpy也在内部使用Python字符串操作函数:
numpy
>>> a1 = ['a','b'] >>> a2 = ['E','F'] >>> map(''.join, zip(a1, a2)) ['aE', 'bF']
wsxa1bj14#
另一个解决方案是将字符串数组转换为对象的python数组,这样就调用了str.add:
>>> import numpy as np >>> a = np.array(['a', 'b', 'c', 'd'], dtype=np.object) >>> print a+a array(['aa', 'bb', 'cc', 'dd'], dtype=object)
这并不慢(比添加整数数组慢两倍)。
iqjalb3h5#
一个更基本、更优雅、更快速的解决方案:
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)
k97glaaz6#
在Python的更高版本中,这可能已经改变,因为在Python 3.10中,这将产生一个map对象。要解决此问题,您需要添加列表函数。
>>> a1 = ['a','b'] >>> a2 = ['E','F'] >>> list(map(''.join, zip(a1, a2))) # <--- See here we have added list() ['aE', 'bF']
6条答案
按热度按时间vbopmzt11#
这可以使用numpy.core.defchararray.add来完成。下面是一个示例:
NumPy数据类型还有其他有用的string operations。
e5njpo682#
You can use the
chararray
subclass对字符串执行数组操作:另一个很好例子:
6psbrbz93#
这可以(也应该)在纯Python中完成,因为
numpy
也在内部使用Python字符串操作函数:wsxa1bj14#
另一个解决方案是将字符串数组转换为对象的python数组,这样就调用了str.add:
这并不慢(比添加整数数组慢两倍)。
iqjalb3h5#
一个更基本、更优雅、更快速的解决方案:
对于较小的阵列,它的速度非常快。
对于较大的阵列,时间差并不多。
k97glaaz6#
在Python的更高版本中,这可能已经改变,因为在Python 3.10中,这将产生一个map对象。
要解决此问题,您需要添加列表函数。