numpy中的元素式字串串连

pbossiut  于 2022-11-24  发布在  其他
关注(0)|答案(6)|浏览(165)

这是一个错误吗?

import numpy as np
a1=np.array(['a','b'])
a2=np.array(['E','F'])

In [20]: add(a1,a2)
Out[20]: NotImplemented

我正在尝试做元素级的字符串连接。我认为Add()是在numpy中完成它的方法,但显然它没有像预期的那样工作。

vbopmzt1

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

e5njpo68

e5njpo682#

You can use the chararray subclass对字符串执行数组操作:

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')
6psbrbz9

6psbrbz93#

这可以(也应该)在纯Python中完成,因为numpy也在内部使用Python字符串操作函数:

>>> a1 = ['a','b']
>>> a2 = ['E','F']
>>> map(''.join, zip(a1, a2))
['aE', 'bF']
wsxa1bj1

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)

这并不慢(比添加整数数组慢两倍)。

iqjalb3h

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)
k97glaaz

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']

相关问题