NumPy配列ndarrayを初期化(zeros, ones, fullなど)

Modified: | Tags: Python, NumPy

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

デフォルトだと型dtypefloat64。第二引数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.]]

デフォルトだと型dtypefloat64。第二引数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だとint64100.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_valuefloatでも元の配列が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の値をintndarrayに代入すると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]]

関連カテゴリー

関連記事