1. ホーム
  2. python

[解決済み] 任意の長さの文字列からなるnumpyの配列を作成するには?

2023-02-16 10:27:51

質問

私はPythonの完全な初心者ですが、与えられた文字列は(事実上)任意の長さにすることができるようです。 string str を取り、それに追加し続けることができます。 str += "some stuff..." . このような文字列の配列を作る方法はあるのでしょうか?

これを試すと、各要素には1文字しか格納されません

strArr = numpy.empty(10, dtype='string')
for i in range(0,10)
    strArr[i] = "test"

一方、ある長さの文字列の配列を初期化できることは知っています、つまり

strArr = numpy.empty(10, dtype='s256')

で、最大256文字の文字列を10個格納することができます。

どのように解決するのですか?

の配列を作成することで可能です。 dtype=object . 通常のnumpyの配列に長い文字列を代入しようとすると、文字列が切り捨てられます。

>>> a = numpy.array(['apples', 'foobar', 'cowboy'])
>>> a[2] = 'bananas'
>>> a
array(['apples', 'foobar', 'banana'], 
      dtype='|S6')

しかし dtype=object を使うと、pythonのオブジェクト参照の配列が得られます。だから、pythonの文字列のすべての動作を持つことができます。

>>> a = numpy.array(['apples', 'foobar', 'cowboy'], dtype=object)
>>> a
array([apples, foobar, cowboy], dtype=object)
>>> a[2] = 'bananas'
>>> a
array([apples, foobar, bananas], dtype=object)

たしかに、オブジェクトの配列なので、オブジェクトに割り当てられる 任意の のようなPythonオブジェクトを配列に割り当てることができます。

>>> a[2] = {1:2, 3:4}
>>> a
array([apples, foobar, {1: 2, 3: 4}], dtype=object)

しかし、これはnumpyを使用する利点の多くを取り消してしまいます。numpyは、生のメモリの大きな連続したブロック上で動作するため、非常に高速です。Pythonオブジェクトで作業すると、多くのオーバーヘッドが追加されます。簡単な例です。

>>> a = numpy.array(['abba' for _ in range(10000)])
>>> b = numpy.array(['abba' for _ in range(10000)], dtype=object)
>>> %timeit a.copy()
100000 loops, best of 3: 2.51 us per loop
>>> %timeit b.copy()
10000 loops, best of 3: 48.4 us per loop