第3回:NumPy配列の作成

に公開

はじめに

本記事は「Pythonで数値計算を行うためのNumPy入門」シリーズの第3回です.
このシリーズでは, "NumPyのよく使われる機能を分野ごとに理解すること" を目標としています.

Pythonで数値計算を行う際に欠かせないライブラリ「NumPy」について,基礎から応用まで体系的に学べます.

シリーズ構成予定(全10記事)

  1. NumPyのインストール 〜 arrayの基本
  2. 配列の追加・挿入・コピー
  3. 配列の作成(ones / zeros / arange / linspace / eye)(本記事)
  4. 配列の結合(hstack / vstack / concatenate)(公開後にリンクを追加する予定)
  5. 条件抽出と検索(where / clip / unique)(公開後にリンクを追加する予定)
  6. 統計処理(mean / std / median ほか)(公開後にリンクを追加する予定)
  7. 線形代数(dot / inv / det / norm)(公開後にリンクを追加する予定)
  8. 乱数生成(rand / randint / normal)(公開後にリンクを追加する予定)
  9. 三角関数と角度変換(sin / arctan2 ほか)(公開後にリンクを追加する予定)
  10. ファイル入出力(savetxt / loadtxt)(公開後にリンクを追加する予定)

私のNumpyライブラリのバージョンは "1.26.4" です.

本記事のゴール

本記事では, 配列の作成 を学んでいきます.ベクトルや行列の作成方法を簡単に作る方法を説明します.

今回扱う関数は以下の5つです.

関数 内容
np.ones() 要素が全て1の配列を作成
np.zeros() 要素が全て0の配列を作成
np.arange() 等差数列(指定した間隔)で配列を作成
np.linspace() 始点から終点までを等分割した配列を作成
np.eye() 単位行列(行列の対角成分が1の正方行列)を作成

np.arange()np.linspace() は似ている内容なので,違いをしっかりと理解しましょう.

NumPyライブラリの読み込み

NumPyを使うためには,まずライブラリの読み込みから始めます.

import numpy as np

numpyライブラリを "np" という名前として,扱えるようにライブラリを読み込んでいます.
以降では "np" という名前を使っていきます.

np.ones() (要素が全て1の配列を作成)

要素が全て1の配列を作成する np.ones() 関数に関して説明します.

# np.ones() による配列の作成 (ベクトル作成)
arr = np.ones(3)
print(arr)
# 出力:[1. 1. 1.]
# 要素を5倍
print(arr * 5)
# 出力:[5. 5. 5.]

# np.ones() による配列の作成 (行列作成)
arr = np.ones((3, 4))
print(arr)
# 出力:[[1. 1. 1. 1.]
        [1. 1. 1. 1.]
        [1. 1. 1. 1.]]
# 要素を5倍
print(arr * 5)
# 出力:[[5. 5. 5. 5.]
        [5. 5. 5. 5.]
        [5. 5. 5. 5.]]

# np.ones() による配列の作成 (3次元のテンソルを作成)
arr = np.ones((2, 3, 4))
print(arr)
# 出力:[[[1. 1. 1. 1.]
         [1. 1. 1. 1.]
         [1. 1. 1. 1.]]
        [[1. 1. 1. 1.]
         [1. 1. 1. 1.]
         [1. 1. 1. 1.]]]
# 要素を5倍
print(arr * 5)
# 出力:[[[5. 5. 5. 5.]
         [5. 5. 5. 5.]
         [5. 5. 5. 5.]]
        [[5. 5. 5. 5.]
         [5. 5. 5. 5.]
         [5. 5. 5. 5.]]]

np.ones() の引数の値を変更することによって,簡単に配列の次元を変更することができます.1次元の配列(ベクトル)を作成したいのであれば np.ones(要素数) とし,2次元の配列(行列)を作成したいのであれば 'np.ones((行数, 列数))とすれば良いです. また,np.ones()` の結果に対して,何かしらの定数を掛け合わせることで,配列の要素を一律で変更することができるので,便利です.

出力内容を確認すると,数字の後に「.」が付いています.「.」が付く事によって,浮動小数点としてデータを保存しています.
データを浮動小数点ではなく,整数として保存する方法を下記に示します.

# np.ones() による配列の作成 (ベクトル作成)
arr = np.ones(3, dtype=np.int32)
print(arr)
# 出力:[1 1 1]
# 要素を5倍
print(arr * 5)
# 出力:[5 5 5]

# np.ones() による配列の作成 (行列作成)
arr = np.ones((3, 4), dtype=np.int32)
print(arr)
# 出力:[[1 1 1 1]
        [1 1 1 1]
        [1 1 1 1]]
# 要素を5倍
print(arr * 5)
# 出力:[[5 5 5 5]
        [5 5 5 5]
        [5 5 5 5]]

整数型のデータしか存在しない場合は,データ型を np.int32 にした方が良いです.

np.zeros() (要素が全て0の配列を作成)

要素が全て0の配列を作成する np.zeros() 関数に関して説明します.

# np.zeros() による配列の作成 (ベクトル作成)
arr = np.zeros(3)
print(arr)
# 出力:[0. 0. 0.]

# np.zeros() による配列の作成 (行列作成)
arr = np.zeros((3, 4))
print(arr)
# 出力:[[0. 0. 0. 0.]
        [0. 0. 0. 0.]
        [0. 0. 0. 0.]]

# np.zeros() による配列の作成 (3次元のテンソルを作成)
arr = np.zeros((2, 3, 4))
print(arr)
# 出力:[[[0. 0. 0. 0.]
         [0. 0. 0. 0.]
         [0. 0. 0. 0.]]
        [[0. 0. 0. 0.]
         [0. 0. 0. 0.]
         [0. 0. 0. 0.]]]

np.zeros() の引数の値を変更することによって,簡単に配列の次元を変更することができます.1次元の配列(ベクトル)を作成したいのであれば np.zeros(要素数) とし,2次元の配列(行列)を作成したいのであれば 'np.zeros((行数, 列数))` とすれば良いです.

np.arange() (等差数列(指定した間隔)で配列を作成)

等差数列(指定した間隔)で配列を作成する np.arange() 関数に関して説明する.

# np.arange() による配列の作成
arr = np.arange(0, 10, 2)
print(arr)
# 出力:[0 2 4 6 8]

# np.arange() による配列の作成
arr = np.arange(0, 2, 0.4)
print(arr)
# 出力:[0. 0.4 0.8 1.2 1.6]

np.arange() の引数を下表にまとめます.

引数番号 引数名 内容 備考
1 start 始点 戻り値に 含まれる
2 stop 終点 戻り値に 含まれない
3 step 間隔 ステップ幅

注意点としては,戻り値として,np.arange() の第一引数は作成される配列に含まれるが,第二引数は作成される配列に含まれない点に考慮する こと.
もし,0以上10以下で2刻みの配列を作成したいのであれば,以下のようなコードを記載したほうが良いです.

# np.arange() による配列の作成
arr = np.arange(0, 10 + 2, 2)
print(arr)
# 出力:[0 2 4 6 8 10]

np.arange() の第二引数に,第三引数の値を足し合わせることによって,0以上10以下で2刻みの配列を作成することができます.

np.linspace() (始点から終点までを等分割した配列を作成)

始点から終点までを等分割した配列を作成する np.linspace() 関数に関して説明する.

# np.linspace() による配列の作成
arr = np.linspace(0, 10, 5)
print(arr)
# 出力:[0. 2.5 5. 7.5 10.]

# np.linspace() による配列の作成
arr = np.linspace(0, 10, 2)
print(arr)
# 出力:[0. 10.]

np.linspace() の引数を下表にまとめます.

引数番号 引数名 内容 備考
1 start 始点 戻り値に 含まれる
2 stop 終点 戻り値に 含まれる
3 num 分割数 start以上stop以下の分割数

注意点としては,np.linspace() の第一引数と第二引数は作成される配列に含まれる点に考慮する こと.注意して,第三引数を考えないと問題が発生しやすい.
もし,0以上10以下で2刻みの配列を作成したいのであれば,以下のようなコードを記載したほうが良いです.

# np.linspace() による配列の作成
arr = np.linspace(0, 10, 5 + 1)
print(arr)
# 出力:[0. 2. 4. 6. 8. 10.]

np.linspace() の第三引数に1を足し合わせ,始点から終点までの分割数を変更することによって,0以上10以下で2刻みの配列を作成することができます.

np.eye() (単位行列を作成)

単位行列を作成する np.eye() 関数に関して説明する.

# np.eye() による配列の作成 (3行3列の行列)
arr = np.eye(3)
print(arr)
# 出力:[[1. 0. 0.]
        [0. 1. 0.]
        [0. 0. 1.]]
# 要素を5倍
print(arr * 5)
# 出力:[[5. 0. 0.]
        [0. 5. 0.]
        [0. 0. 5.]]

# np.eye() による配列の作成 (5行5列の行列)
arr = np.eye(5)
print(arr)
# 出力:[[1. 0. 0. 0. 0.]
        [0. 1. 0. 0. 0.]
        [0. 0. 1. 0. 0.]
        [0. 0. 0. 1. 0.]
        [0. 0. 0. 0. 1.]]
# 要素を8倍
print(arr * 8)
# 出力:[[8. 0. 0. 0. 0.]
        [0. 8. 0. 0. 0.]
        [0. 0. 8. 0. 0.]
        [0. 0. 0. 8. 0.]
        [0. 0. 0. 0. 8.]]

np.eye() の引数の値を変更することによって,簡単に正方行列の行数と列数を変更することができます.対角成分が1となる単位行列を作成することができる.
また, np.eye() の結果に対して,何かしらの定数を掛け合わせることで,配列の対角成分を一律で変更することができるので,便利です.

まとめ

NumPyライブラリの ones / zeros / arange / linspace / eye を比較します.

操作 関数 よく使う場面
要素が全て1の配列を作成 np.ones() 配列の全要素を同じ値とする
要素が全て0の配列を作成 np.zeros() 要素の初期化
等差数列(指定した間隔)で配列を作成 np.arange() 時間刻み
始点から終点までを等分割した配列を作成 np.linspace() 始点から終点までの補間点の作成
単位行列(行列の対角成分が1の正方行列)を作成 np.eye() 座標変換

配列の作成方法を理解することで,データの初期化が自由にできる ようになります.

次回予告

第4回:「配列の結合(hstack / vstack / concatenate)」

  • np.hstack() (配列を方向に結合)
  • np.vstack() (配列を方向に結合)
  • np.concatenate() (配列を任意方向に結合)

「複数の配列を計合する方法」を説明します.

参考文献

本記事を作成するに当たって参考にしたサイトをまとめました.

Discussion