NumPy配列ndarrayを初期化(zeros, ones, fullなど)
NumPyですべての要素を同じ値で初期化した配列ndarray
を生成する方法を説明する。
任意の形状shape
とデータ型dtype
を指定して初期化するnp.zeros()
, np.ones()
, np.full()
と、既存の配列ndarray
と同じ形状・データ型で初期化するnp.zeros_like()
, np.ones_like()
, np.full_like()
がある。
空の配列を生成する方法は以下の記事を参照。
すべて同じ値ではなく、np.array()
でリストから任意の値の並びのndarray
を生成したり、np.arange()
やnp.linspace()
で連番・等差数列のndarray
を生成したりすることもできる。
本記事のサンプルコードのNumPyのバージョンは以下の通り。バージョンによって仕様が異なる可能性があるので注意。
import numpy as np
print(np.__version__)
# 1.26.1
numpy.zeros(): 0で初期化(ゼロ埋め)
全要素を0
で初期化した配列ndarray
を生成するにはnumpy.zeros()
を使う。
生成する配列の形状shape
を第一引数として渡す。スカラーの場合は一次元配列、タプルの場合は多次元配列となる。
print(np.zeros(3))
# [0. 0. 0.]
print(np.zeros((2, 3)))
# [[0. 0. 0.]
# [0. 0. 0.]]
デフォルトだと型dtype
はfloat64
。第二引数dtype
で指定することもできる。
print(np.zeros(3).dtype)
# float64
print(np.zeros(3, dtype=np.int64))
# [0 0 0]
print(np.zeros(3, dtype=np.int64).dtype)
# int64
NumPyにおけるデータ型dtype
については以下の記事を参照。
numpy.ones(): 1で初期化
全要素を1
で初期化した配列ndarray
を生成するにはnumpy.ones()
を使う。
使い方はnumpy.zeros()
と同じ。
生成する配列の形状shape
を第一引数として渡す。
print(np.ones(3))
# [1. 1. 1.]
print(np.ones((2, 3)))
# [[1. 1. 1.]
# [1. 1. 1.]]
デフォルトだと型dtype
はfloat64
。第二引数dtype
で指定することもできる。
print(np.ones(3).dtype)
# float64
print(np.ones(3, dtype=np.int64))
# [1 1 1]
print(np.ones(3, dtype=np.int64).dtype)
# int64
numpy.full(): 任意の値で初期化
全要素を任意の値で初期化した配列ndarray
を生成するにはnumpy.full()
を使う。
第一引数に生成する配列の形状shape
、第二引数に任意の埋める値fill_value
を渡す。
print(np.full(3, 100))
# [100 100 100]
print(np.full((2, 3), 0.123))
# [[0.123 0.123 0.123]
# [0.123 0.123 0.123]]
型dtype
は埋める値fill_value
に応じて設定される。例えば、100
だとint64
で100.0
だとfloat64
になる。
print(np.full(3, 100).dtype)
# int64
print(np.full(3, 100.0).dtype)
# float64
print(np.full(3, 0.123).dtype)
# float64
第三引数dtype
で型を指定することもできる。型変換(キャスト)された値で初期化される。
print(np.full(3, 100, dtype=np.float64))
# [100. 100. 100.]
print(np.full(3, 0.123, dtype=np.int64))
# [0 0 0]
numpy.zeros_like(): 0で初期化(ゼロ埋め)
例として、形状shape
とデータ型dtype
が異なる2つの配列ndarray
を使う。
a_int64 = np.arange(3)
print(a_int64)
# [0 1 2]
print(a_int64.dtype)
# int64
a_float64 = np.arange(6).reshape(2, 3) / 10
print(a_float64)
# [[0. 0.1 0.2]
# [0.3 0.4 0.5]]
print(a_float64.dtype)
# float64
全要素を0
で初期化した配列ndarray
を生成するにはnumpy.zeros_like()
を使う。
第一引数に元となる配列を指定する。元の配列と同じ形状shape
・同じ型dtype
で値が0
の配列が生成される。
print(np.zeros_like(a_int64))
# [0 0 0]
print(np.zeros_like(a_int64).dtype)
# int64
print(np.zeros_like(a_float64))
# [[0. 0. 0.]
# [0. 0. 0.]]
print(np.zeros_like(a_float64).dtype)
# float64
第二引数dtype
を指定すると、元の配列の型ではなく指定した型になる。
print(np.zeros_like(a_int64, dtype=np.float64))
# [0. 0. 0.]
print(np.zeros_like(a_int64, dtype=np.float64).dtype)
# float64
numpy.ones_like(): 1で初期化
全要素を1
で初期化した配列ndarray
を生成するにはnumpy.ones_like()
を使う。
使い方はnumpy.zeros_like()
と同じ。第一引数に元となる配列を指定する。
print(np.ones_like(a_int64))
# [1 1 1]
print(np.ones_like(a_int64).dtype)
# int64
print(np.ones_like(a_float64))
# [[1. 1. 1.]
# [1. 1. 1.]]
print(np.ones_like(a_float64).dtype)
# float64
第二引数dtype
を指定すると、元の配列の型ではなく指定した型になる。
print(np.ones_like(a_int64, dtype=np.float64))
# [1. 1. 1.]
print(np.ones_like(a_int64, dtype=np.float64).dtype)
# float64
numpy.full_like(): 任意の値で初期化
全要素を任意の値で初期化した配列ndarray
を生成するにはnumpy.full_like()
を使う。
第一引数に元となる配列を、第二引数に任意の埋める値fill_value
を渡す。
print(np.full_like(a_int64, 100))
# [100 100 100]
print(np.full_like(a_int64, 100).dtype)
# int64
print(np.full_like(a_float64, 100))
# [[100. 100. 100.]
# [100. 100. 100.]]
print(np.full_like(a_float64, 100).dtype)
# float64
fill_value
の型よりも元の配列の型が優先されるので注意。例えばfill_value
がfloat
でも元の配列がint
だと、int
に型変換(キャスト)される。
print(np.full_like(a_int64, 0.123))
# [0 0 0]
print(np.full_like(a_int64, 0.123).dtype)
# int64
第三引数dtype
を指定すると、元の配列の型ではなく指定した型になる。
print(np.full_like(a_int64, 0.123, dtype=np.float64))
# [0.123 0.123 0.123]
print(np.full_like(a_int64, 0.123, dtype=np.float64).dtype)
# float64
既存の配列の全要素の値を任意の値に置き換え
上述のzeros_like()
, ones_like()
, full_like()
は既存の配列を元に新たな配列を生成する。元の配列はそのまま。
a = np.arange(6).reshape(2, 3)
print(a)
# [[0 1 2]
# [3 4 5]]
b = np.zeros_like(a)
print(b)
# [[0 0 0]
# [0 0 0]]
print(a)
# [[0 1 2]
# [3 4 5]]
既存の配列の全ての要素の値を任意の値に置き換えたい場合は、スライスで全要素を選択して新たな値を代入する。
a[:, :] = 0
print(a)
# [[0 0 0]
# [0 0 0]]
末尾の, :
は省略できるので、次元数によらず[:]
で全要素を選択・代入できる。
a[:] = 1
print(a)
# [[1 1 1]
# [1 1 1]]
代入する値は配列のデータ型dtype
に型変換(キャスト)されるので注意。例えば、float
の値をint
のndarray
に代入するとint
にキャストされてしまう。astype()
で配列の型を変更してから代入する必要がある。
print(a.dtype)
# int64
a[:] = 0.123
print(a)
# [[0 0 0]
# [0 0 0]]
a = a.astype(np.float64)
a[:] = 0.123
print(a)
# [[0.123 0.123 0.123]
# [0.123 0.123 0.123]]