numpy.full
関数は、全ての要素が同じ任意の値の初期化配列を作成する関数です。これと同じように、既存の配列のshapeやdtype等の属性を引き継いだ上で、要素だけを任意の値で初期化した新しい配列を作成するnumpy.full_like
関数というものもあります。
このページでは、これら両方の関数について解説します。初期化配列の作成はよく行うことなので、しっかりと理解を深めておきましょう。
1. np.full関数の使い方
1.1. 書式
まずは、基本的な書き方を確認しましょう。
書き方:
np.full(shape, fill_value, dtype=None, order='C')
パラメーター:
shape: 整数 または 整数のシーケンス 生成する配列のshapeを指定する。 |
fill_value: スカラー 初期値を指定する。 |
dtype: データ型(オプション) データ型を指定する。デフォルトのNoneでは、fill_valueのデータ型を引き継ぐ。 |
order: ’C’ か ‘F’ (オプション) 配列のメモリレイアウトを C-order(行優先)か Fortran-order(列優先)のどちらかから選択。デフォルトは ‘C’。 |
戻り値:
out: ndarray 指定した shape, fill_value, dtype, order の新しい配列 |
一緒に確認したい関数:
1.2. サンプルコード
それでは、サンプルコードを見ながら使い方を確認していきましょう。以下のコードでは、長さ5で初期値が0.1の1次元配列を生成しています。
import numpy as np
# shape(5, )で初期値が0.1の初期化配列を生成
np.full(5, 0.1)
多次元配列を生成する場合は、shapeはタプルで渡さなければいけません。間違えて数値で渡さないようにしましょう。
# 多次元配列の場合、shapeをタプルで渡す
np.full((2, 5), 10)
少しテクニカルな方法も見ておきましょう。np.full関数を使って要素が空の配列を生成するには、次のように fill_valueにnp.nanを渡します。
np.full((2, 5), np.nan)
次のコードのように、無限大の浮動小数点数(float型)を表す inf
を初期値に指定することも可能です。
# 無限大 inf を初期値に指定することも可能
np.full((2, 2), np.inf)
ブロードキャストを利用して、初期値を次のように指定することも可能です。ブロードキャストについては『覚えておくべきNumPy配列のブロードキャストのルール』で解説しています。
以下のコードをご覧ください。
# 初期値をブロードキャストして指定
np.full((3, 3), [1, 2, 3])
オプション引数 dtype=
と order=
これらのオプション引数については、以下で説明していますが使用することはほとんどありません。気になる場合はご確認ください。
2. np.full_like関数の使い方
さて、np.full
関数と同じく、任意の初期値の配列を生成する関数に np.full_like
関数があります。
np.full_like
関数は、既存の配列のshape, dtype, order, サブクラスを引き継いだ上で、要素を任意の値で初期化した新しい配列を生成します。そのため、np.full
関数と似ているとは言っても同じ感覚で使うものではありません。ここでしっかり確認しておきましょおう。
2.1. 書式
まずは、基本的な書き方を確認しましょう。
書き方:
np.full_like(a, fill_value, dtype=None, order='K', subok=True)
パラメータ:
a: array_like オブジェクト(リストや配列など) 生成する配列のshapeを指定する。 |
fill_value: スカラー 初期値を指定する。 |
dtype: データ型(オプション) データ型を指定する。デフォルトのNoneでは、fill_valueのデータ型を引き継ぐ。 |
order: ’C’ ‘F’ ‘A’ ‘K’ のいずれか(オプション) メモリ内での配列の並び方を上書きしたい場合に指定します。’C’はC言語方式です。’F’はFortran形式です。’A’は、元の配列がFortranであればFortran形式で、そうでなければ’C’言語方式で並べます。’K’は、元の配列のメモリ内の並び方に近いものを選択します。デフォルトは’K’です。 |
subok: ブール値(オプション) Trueでは、新しく生成される配列は、元の配列のサブクラス(マスクされた配列かマトリックス)を引き継ぎます。Falseでは、通常の配列として生成されます。デフォルトはTrueです。 |
shape: 整数 または 整数のシーケンス(オプション) 新しく生成する配列のshapeを上書きする。order=’K’で次元数を変えない場合はorderは元の配列を引き継ぐ。それ以外の場合はorder=’C’になる。 |
戻り値:
元の配列 a と同じshape, dtype, order, サブクラスで、要素を任意の値で初期化した新しい配列 |
一緒に確認したい関数:
- zeros_like: 既存の配列から要素が0の初期化配列を生成
- ones_like: 既存の配列から要素が1の初期化配列を生成
- empty_like: 既存の配列から要素が空の(未初期化の)配列を生成
それでは、実際のコードで使い方を確認していきましょう。
2.2. サンプルコード
np.full_like
関数は、既存の配列のshape, dtype, orderを引き継いで、要素の値を任意のものに変更した新しい配列を生成します。
以下の、要素が整数の配列 arr1
を使って確認しましょう。
import numpy as np
arr1= np.arange(6).reshape(2, 3)
arr1
np.full_like関数は元の配列の属性を引き継ぐ
np.full_like
関数を使う上で重要な点は、この関数は元の配列の属性を強く引き継ぐということです。
例えば、上で作成した要素が整数(int型)の配列 arr1
をnp.full_like
関数に渡して、不動総数点数(float型)の値で初期化した新しい配列を生成してみましょう。
# dtypeは元の配列のものが優先のため上書きされません。
arr2 = np.full_like(arr1, 1.1)
arr2
ご覧のように、引数のfill_valueで1.1の浮動小数点数(float型)を指定しているにも関わらず、生成された配列の要素は整数((int型)になっています。
これは、元の配列の要素の型と、fill_valueで指定した数値の型が異なる場合、前者が優先されるようになっているからです。そのため小数点以下が切り捨てられて、整数の1に直されています。
このように元の配列の属性を維持しようとする点が、np.full_like
関数の大きな特徴です。これは配列のshapeと要素の型(dtype)だけではなく、メモリオーダーやサブクラスも当てはまります。
そのため、np.full_like
関数では、新しく生成する配列に元々の配列の属性を受け継ぎたくない場合は、それをオプション引数で指定する必要があります。
それぞれ見ていきましょう。
要素の型を変更(dtype=)
np.full_like
関数で元々の配列のdtypeを上書きしたい場合は、オプション引数 dtype=
を指定する必要があります
以下のコードでは、オプション引数で dtype=floatと指定することで、元の配列のdtypeのint型を、新しい配列ではfloat型に上書きしています。
arr3 = np.full_like(arr1, 1.1, dtype=float)
arr3
# 要素が空の配列を生成
arr4 = np.full_like(arr1, np.nan, dtype=float)
arr4
メモリオーダーの変更(order=)
同じように、オプション引数 order=
で、メモリへの要素の格納方式を上書きすることもできます。
それぞれ以下のコードでご確認ください。
''' orderの上書き '''
# C言語方式の配列を生成
arr5 = np.arange(6).reshape(2, 3, order='C')
print('元の配列: \n', arr5.flags, '\n')
# Fortran方式で上書き
arr6 = np.full_like(arr5, 10, order='F')
print('Fortran方式で上書き: \n', arr6.flags, '\n')
# Aは、元の配列がCならCに、FならFにする
arr7 = np.full_like(arr5, 10, order='A')
print("order='A': \n", arr7.flags, '\n')
# Kは、元の配列に近い並べ方をする
arr8 = np.full_like(arr5, 10, order='K')
print("order='K': \n", arr8.flags)
サブクラスの変更(subok=)
NumPyの配列(ndarray)にはサブクラスとして、マトリック(matrix)とマスクされた配列(MakedArray)クラスがあります。元となる配列が、これらのサブクラスである場合、デフォルトの subok=True
では、そのサブクラスを受け継ぎます。subok=False
を指定すると、サブクラスを引き継がず、配列(ndarray)として生成されます。
これも実際に見てみましょう。
まず、以下のコードでは、ndarrayのサブクラスであるmatrixを生成しています。
# ndarrayのサブクラスである、np.matrixを生成します。
arr9 = np.array(np.mat('1 2; 3 4'), subok=True)
arr9
この配列を引き継いで、新たな配列arr10を生成します。この時、「subok=True(デフォルト値)」なら、サブクラスをそのまま引き継ぎます。
なお、「subok=True」はデフォルトなので、わざわざ書く必要はありませんが、ここでは明示的にするためにあえて書くことにします。
arr10 = np.full_like(arr9, 10, subok=True)
arr10
subok=False
にすると、元のサブクラスは引き継がずに、配列(ndarray)として生成されます。
arr11 = np.full_like(arr9, 10, subok=False)
arr11
shapeの変更
np.full_like
関数では、新たなshapeを指定することもできます。以下のコードをご覧ください。
arr12 = np.full_like(arr1, 10, shape=(3, 2))
arr12
3. まとめ
以上がnumpy.full
関数とnumpy.full_like
関数の使い方です。
np.full
関数は、全ての要素が同じ指定の値を持つ新しい初期化配列を生成します。
一方で、np.full_like
関数は、既存の配列の属性(shape, dtype, メモリオーダー, サブクラス)を引き継いだ上で、要素のみを指定の値で初期化した新しい初期化配列を生成します。
それぞれの違いをしっかり把握した上で使い分けるようにしましょう。
なお、同じく初期化配列を生成する関数は他に次のようなものもあります。これらも併せて確認しておくと良いでしょう。
コメント