未初期化配列

未初期化配列

numpy.empty()

 numpy.empty() は要素が初期化されていない空の配列を返します。

 numpy.empty(shape, dtype=float, order='C')

 3 × 3 の未初期化配列を生成してみます。

# EMPTY_01-1

import numpy as np

# 未初期化配列を生成
arr = np.empty((3, 3))

print(arr)
[[1.91290538e+092 1.43587367e+214 2.55172530e+151]
 [2.29249727e+170 1.97626258e-323 1.06099790e-313]
 [3.50108086e-310 2.14701544e+289 1.56705074e+294]]

 各要素には不規則な値が格納されています。empty (空) とは全ての要素が 0 であるという意味ではありません。ほとんどの配列生成関数は確保したメモリブロック (連続メモリ) の値を再設定 (初期化) しますが、numpy.empty() はそのような書き込みを行なわずに、現在メモリに格納されている値をそのまま配列要素とします。

 一般に、numpy.empty() は要素を書き込むための空箱として使うので、初期化の二度手間を省いて処理速度を向上させるというメリットがあります。np.empty(10**5) , np.zeros(10**5), np.ones(10**5) で、それぞれ 10 万要素をもつ配列を生成して処理速度を比較してみます。

# EMPTY_01-2

%timeit np.empty(10**5)
7.05 µs ± 71.6 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
# EMPTY_01-3

%timeit np.zeros(10**5)
7.73 µs ± 157 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
# EMPTY_01-4

%timeit np.ones(10**5)
565 µs ± 4.77 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

 np.empty() と np.zeros() の間にそれほど差はありませんが、np.ones() は 2 桁のオーダーで遅くなります。
 

numpy.empty_like()

 numpy.empty_like() は、受け取った配列と同じサイズの未初期化配列を返します。

 empty_like(prototype, dtype=None, order='K', subok=True)

 たとえば、prototype に 3 × 3 の配列を渡すと 4 × 4 の未初期化配列を返します。

# EMPTY_02

import numpy as np

# 4×4の配列xを生成
x = np.ones((3, 3))

# xと同じサイズの未初期化配列を生成
y = np.empty_like(x)

print(y)
[[1.91290538e+092 1.43587367e+214 2.55172530e+151]
 [2.29249727e+170 1.97626258e-323 1.06099790e-313]
 [3.50108086e-310 2.14701544e+289 1.56705074e+294]]