web-dev-qa-db-ja.com

numpy配列を作成するときのdtype = objectの意味は何ですか?

私は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)

アレイの作成中に、すべての操作を実行できます。

なぜこれが起こっているのか誰にも教えてもらえますか?

17
Avinash Pandey

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には、他にも多くの ベクトル化された文字列メソッド もあります。

24
Alex Riley