1. ホーム
  2. パイソン

[解決済み】NaNで埋め尽くされたnumpyの行列を作成する

2022-04-03 13:24:22

質問

次のようなコードがあります。

r = numpy.zeros(shape = (width, height, 9))

を作成します。 width x height x 9 行列がゼロで埋め尽くされます。その代わりに、初期化する関数や方法があれば知りたいです。 NaN を簡単な方法で作成します。

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

numpyのベクトル演算でループが必要になることはほとんどありません。 初期化されていない配列を作成し、一度にすべてのエントリに代入することができます。

>>> a = numpy.empty((3,3,))
>>> a[:] = numpy.nan
>>> a
array([[ NaN,  NaN,  NaN],
       [ NaN,  NaN,  NaN],
       [ NaN,  NaN,  NaN]])


オルタナティヴのタイミングを計りました a[:] = numpy.nan こちらと a.fill(numpy.nan) Blaenkさんが投稿された通りです。

$ python -mtimeit "import numpy as np; a = np.empty((100,100));" "a.fill(np.nan)"
10000 loops, best of 3: 54.3 usec per loop
$ python -mtimeit "import numpy as np; a = np.empty((100,100));" "a[:] = np.nan" 
10000 loops, best of 3: 88.8 usec per loop

このタイミングでは ndarray.fill(..) の方が高速です。一方、numpyの便利な実装は、スライス全体に一度に値を割り当てることができ、コードの意図が非常に明確で気に入っています。

なお ndarray.fill はその操作をインプレースで行うので numpy.empty((3,3,)).fill(numpy.nan) は、代わりに None .