これはバグですか?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でそれを行う方法だと思ったが、明らかに期待どおりに動作していない。
これはバグですか?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でそれを行う方法だと思ったが、明らかに期待どおりに動作していない。
これは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)
これは(整数配列を付加することとして二倍遅い未満)が遅いではない:
あなたがリンクしている 'add'文字列演算は、python 3.2のnumpy 1.6.1に対して(質問のように)' NotImplemented'を与えます。どのバージョンが実装されているか知っていますか? –
@FrancescoMontesanoは、Ubuntu 12.04.2 LTSでそのバージョンの組み合わせをチェックしていますが、私の答えの例は期待通りに動作します。一般的に言えば、 'np.add'を使うと、どのバージョンでも' NotImplemented'が発生します。 'np.core.defchararray.add'を使用していることを確認してください。 –
これで、ドキュメントの 'add'の完全なシグネチャを見てきました(私は以前これを見逃していました)。とにかく、numpyが 'np.core.defchararray。*'を対応する数値ndarray演算にラップするといいでしょう。私は、 'np.add'をするのを忘れないように、もっときれいで簡単だと思います。 –
numpy
も内部Pythonの文字列操作関数を使用し、この(とすべきである)、純粋なPythonで行うことができる。
>>> a1 = ['a','b']
>>> a2 = ['E','F']
>>> map(''.join, zip(a1, a2))
['aE', 'bF']
私が使用していた追加機能はnumpyのトップレベルにはありません。どんな理由であれ、それらのどちらかがより速く/より良い、または優先されますか? – Dave31415
これは質問に答えません。 numpyでこれをやりたいときがあります。文字列の大きな配列を扱うときオリジナルのポスターは、純粋なPythonを使用する単純な例を示していましたが、問題の解決策を求めていました。 – Thucydides411
@ Thucydides411私の答えを書いている時点で理解していたことから、numpyは組み込みのPythonプリミティブを使用しただけなので、どのような利点があるのか分かりませんでした。それが本当かどうかは分かりませんが、それはそうではないようです。たぶん私は「すべてPython標準ライブラリの文字列メソッドに基づいている」という記述を誤って解釈したのかもしれません。ドキュメント内 –
別の解決策は、そのstr.addが呼び出されるように、オブジェクトのパイソンの配列に文字列配列を変換することです。文字列で配列操作を実行する
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')
ドキュメントから、_ "新しい開発にはお勧めできません" _ – Eric
名前が示すように、番号が数字のためのものです。 Python自体はかなり良い文字列操作を持っています。なぜそれを使用しないのですか? '' ".join([" a "、" b "])'はうまく動作します。 – Keith
私はこれを見ていたhttp://docs.scipy.org/doc/numpy/reference/routines.char.html – Dave31415
それは素晴らしいです。しかし、 "それらはすべてPython標準ライブラリの文字列メソッドに基づいています。"標準ライブラリを使用すれば、numpyに依存しないコードを書くことができます。 – Keith