40

これはバグですか?

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

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

要素ごとの文字列連結を実行しようとしています。Add()がnumpyでそれを行う方法だと思いましたが、明らかに期待どおりに機能していません。

4

5 に答える 5

71

これは、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データ型で利用できる他の便利な文字列操作があります。

于 2012-12-16T23:49:52.340 に答える
13

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')
于 2014-05-09T06:08:10.223 に答える
7

numpyこれは、Pythonの文字列操作関数を内部で使用するのと同様に、純粋なPythonで実行できます(実行する必要があります) 。

>>> a1 = ['a','b']
>>> a2 = ['E','F']
>>> map(''.join, zip(a1, a2))
['aE', 'bF']
于 2012-03-31T18:29:57.860 に答える
3

別の解決策は、文字列配列をオブジェクトの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)

これはそれほど遅くはありません(整数配列を追加する場合の2倍未満)。

于 2013-06-28T21:11:26.313 に答える
2

もう1つの基本的でエレガントかつ高速なソリューション:

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)
于 2018-09-18T14:32:22.197 に答える