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]]