私はnumpy配列を試していて、文字列のnumpy配列を作成しました:
ar1 = np.array(['avinash', 'jay'])
公式ガイドから読んだように、numpy配列の操作は個々の要素に伝播されます。だから私はこれをやった:
ar1 * 2
しかし、私はこのエラーを受け取ります:
TypeError Traceback (most recent call last)
<ipython-input-22-aaac6331c572> in <module>()
----> 1 ar1 * 2
TypeError: unsupported operand type(s) for *: 'numpy.ndarray' and 'int'
しかし、dtype=object
ar1 = np.array(['avinash', 'jay'], dtype=object)
アレイの作成中に、すべての操作を実行できます。
なぜこれが起こっているのか誰にも教えてもらえますか?
NumPy配列は、連続したメモリブロックとして保存されます。通常、それらは単一のデータ型(整数、浮動小数点数、固定長文字列など)を持ち、メモリ内のビットはそのデータ型の値として解釈されます。
_dtype=object
_を使用した配列の作成は異なります。配列によって取得されたメモリは、保存されているPythonオブジェクトへのポインターで満たされますelsewhereメモリ内(Python list
はオブジェクトそのものではなく、オブジェクトへのポインタのリストにすぎません).
_*
_などの算術演算子は、_ar1
_データ型を持つ_string_
_などの配列では機能しません(代わりに特別な関数があります-以下を参照)。 NumPyはメモリ内のビットを文字として扱うだけであり、_*
_演算子はここでは意味がありません。ただし、行
_np.array(['avinash','jay'], dtype=object) * 2
_
これは、配列がPython文字列の配列(ポインター)であるため機能します。 _*
_演算子は、これらのPython文字列オブジェクトに対して適切に定義されています。新しいPython文字列がメモリ内に作成され、新しい文字列への参照を持つ新しいobject
配列が返されます。
_string_
_または_unicode_
_ dtypeの配列があり、各文字列を繰り返したい場合は、_np.char.multiply
_を使用できます。
_In [52]: np.char.multiply(ar1, 2)
Out[52]: array(['avinashavinash', 'jayjay'],
dtype='<U14')
_
NumPyには、他にも多くの ベクトル化された文字列メソッド もあります。