numpy.zeros_like関数で既存配列から要素が0の初期化配列を生成する方法

np.zeros_like関数は、既にある配列の属性を引き継いで、要素のみを0で初期化した新しい配列を生成する関数です。このページでは、この関数の使い方を解説します。

なお、同じような関数にnp.zeros関数があります。こちらは既存の配列の属性は引き継がず、指定のshapeで要素が0の初期化配列を生成する際に使います。これについては、『numpy.zeros関数で要素が0の初期化配列を生成する方法』で解説していますので、ぜひ併せてご確認ください。

それでは、np.zeros_like関数の使い方を見ていきましょう。

目次

1. 書式

まずは、np.zeros_like関数の基本的な書き方を確認しましょう。

numpy.zeros_like

書き方:

numpy.zeros_like(a, dtype=None, order='K', subok=True, shape=None)

パラメータ:

a: array_like オブジェクト(リストや配列など)
生成する配列のshapeを指定する。
dtype: データ型(オプション)
データ型を上書きしたい場合に指定する。
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, サブクラスで、要素を0で初期化した新しい配列

一緒に確認したい関数:

  • ones_like既存の配列から要素が1の初期化配列を生成
  • full_like既存の配列から任意の値の初期化配列を生成
  • empty_like: 既存の配列から要素が空の(未初期化の)配列を生成
  • zeros: 要素が0の初期化配列を生成

それでは、実際のコードで使い方を確認していきましょう。

2. サンプルコード

np.zeros_like関数は、既存の配列の形状、データ型、メモリレイアウト、サブクラスなどを引き継いで、要素を0で初期化した新しい配列を生成します。

以下の、要素が整数の配列 xを使って確認しましょう。

In [1]:
import numpy as np
x = np.arange(9).reshape(3, 3)
x
Out[1]:
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

この配列 xnp.zeros_like関数に渡すと、要素を0で初期化してくれます。

In [2]:
# 配列 x の要素を0で初期化した新しい配列を生成
np.zeros_like(x)
Out[2]:
array([[0, 0, 0],
       [0, 0, 0],
       [0, 0, 0]])

データ型の変更

元の配列からデータ型を変えたい場合は、オプション引数 dtype= で任意のデータ型を指定します。なお、データ型については『NumPyのdtype属性の一覧と参照・指定・変更方法』で詳しく解説していますので、確認しておくと良いでしょう。

In [3]:
# 元の配列からデータ型を変更する
np.zeros_like(x, dtype=float)
Out[3]:
array([[0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.]])

メモリレイアウトの変更

Pythonの通常のメモリレイアウトはC言語方式です。しかし時には、Fortran方式のデータを扱うこともあるかもしれません。その時はオプション引数 order= でメモリレイアウトを変更することができます。

In [4]:
#  メモリレイアウトの変更
y = np.zeros_like(x, order='F')
y.flags['F_CONTIGUOUS']
Out[4]:
True

shapeの変更

元の配列からshapeを変更したい場合は、オプション引数 shape= を使います。

In [5]:
#  元の配列からshapeを変更する
np.zeros_like(x, shape=(9, ))
Out[5]:
array([0, 0, 0, 0, 0, 0, 0, 0, 0])

サブクラスの変更

np.zeros_like関数は元の配列のサブクラスも引継ぎます。

NumPyの配列(ndarray)にはサブクラスとして、マトリック(matrix)とマスクされた配列(MakedArray)クラスがあります。以下のコードではマトリックスを生成しています。

In [6]:
#  元の配列が配列のサブクラスの場合
z = np.mat('1, 2; 3, 4')
z
Out[6]:
matrix([[1, 2],
        [3, 4]])

デフォルトでは、元のオブジェクトがマトリックスの場合、np.zeros_like関数で生成されるオブジェクトもマトリックスになります。

In [7]:
#  デフォルトではサブクラスを引き継ぐ
np.zeros_like(z)
Out[7]:
matrix([[0, 0],
        [0, 0]])

サブクラスを引き継がずに、新しい配列として初期化したい場合は、オプション引数で subok=False と指定します。

In [8]:
#  subok= Falseで配列として生成
np.zeros_like(z, subok=False)
Out[8]:
array([[0, 0],
       [0, 0]])

3. まとめ

以上がnp.zeros_like関数の使い方です。

この関数は、既にある配列の属性(データ型、メモリレイアウト、サブクラス)を引き継いだ上で、要素のみ0で初期化した配列を生成します。

もし引き継ぎたくない属性がある場合は、オプション引数で一つずつ指定してやる必要があります。

この点が、np.zeros関数と異なるところです。np.zeros関数については、以下で解説しているので確認して使い分けるようにすると良いでしょう。

また、np.zeros_like関数と同じく、既にある配列を引き継いで要素を初期化した配列を生成する関数には以下のものもあります。これらも併せて確認しておくと良いでしょう。

それぞれの違いをしっかり把握した上で使い分けるようにしましょう。



よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次
閉じる