2012-03-31 18 views
17

これはバグですか?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でそれを行う方法だと思ったが、明らかに期待どおりに動作していない。

+1

名前が示すように、番号が数字のためのものです。 Python自体はかなり良い文字列操作を持っています。なぜそれを使用しないのですか? '' ".join([" a "、" b "])'はうまく動作します。 – Keith

+1

私はこれを見ていたhttp://docs.scipy.org/doc/numpy/reference/routines.char.html – Dave31415

+2

それは素晴らしいです。しかし、 "それらはすべてPython標準ライブラリの文字列メソッドに基づいています。"標準ライブラリを使用すれば、numpyに依存しないコードを書くことができます。 – Keith

答えて

30

これは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があります。

>>> import numpy as np 
>>> a = np.array(['a', 'b', 'c', 'd'], dtype=np.object) 
>>> print a+a 
array(['aa', 'bb', 'cc', 'dd'], dtype=object) 

これは(整数配列を付加することとして二倍遅い未満)が遅いではない:

+0

あなたがリンクしている 'add'文字列演算は、python 3.2のnumpy 1.6.1に対して(質問のように)' NotImplemented'を与えます。どのバージョンが実装されているか知っていますか? –

+0

@FrancescoMontesanoは、Ubuntu 12.04.2 LTSでそのバージョンの組み合わせをチェックしていますが、私の答えの例は期待通りに動作します。一般的に言えば、 'np.add'を使うと、どのバージョンでも' NotImplemented'が発生します。 'np.core.defchararray.add'を使用していることを確認してください。 –

+0

これで、ドキュメントの 'add'の完全なシグネチャを見てきました(私は以前これを見逃していました)。とにかく、numpyが 'np.core.defchararray。*'を対応する数値ndarray演算にラップするといいでしょう。私は、 'np.add'をするのを忘れないように、もっときれいで簡単だと思います。 –

4

numpyも内部Pythonの文字列操作関数を使用し、この(とすべきである)、純粋なPythonで行うことができる。

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

私が使用していた追加機能はnumpyのトップレベルにはありません。どんな理由であれ、それらのどちらかがより速く/より良い、または優先されますか? – Dave31415

+7

これは質問に答えません。 numpyでこれをやりたいときがあります。文字列の大きな配列を扱うときオリジナルのポスターは、純粋なPythonを使用する単純な例を示していましたが、問題の解決策を求めていました。 – Thucydides411

+0

@ Thucydides411私の答えを書いている時点で理解していたことから、numpyは組み込みのPythonプリミティブを使用しただけなので、どのような利点があるのか​​分かりませんでした。それが本当かどうかは分かりませんが、それはそうではないようです。たぶん私は「すべてPython標準ライブラリの文字列メソッドに基づいている」という記述を誤って解釈したのかもしれません。ドキュメント内 –

1

別の解決策は、そのstr.addが呼び出されるように、オブジェクトのパイソンの配列に文字列配列を変換することです。文字列で配列操作を実行する

7

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') 
+0

ドキュメントから、_ "新しい開発にはお勧めできません" _ – Eric