第3回:NumPy配列の作成
はじめに
本記事は「Pythonで数値計算を行うためのNumPy入門」シリーズの第3回です.
このシリーズでは, "NumPyのよく使われる機能を分野ごとに理解すること" を目標としています.
Pythonで数値計算を行う際に欠かせないライブラリ「NumPy」について,基礎から応用まで体系的に学べます.
シリーズ構成予定(全10記事)
- NumPyのインストール 〜 arrayの基本
- 配列の追加・挿入・コピー
- 配列の作成(ones / zeros / arange / linspace / eye)(本記事)
- 配列の結合(hstack / vstack / concatenate)(公開後にリンクを追加する予定)
- 条件抽出と検索(where / clip / unique)(公開後にリンクを追加する予定)
- 統計処理(mean / std / median ほか)(公開後にリンクを追加する予定)
- 線形代数(dot / inv / det / norm)(公開後にリンクを追加する予定)
- 乱数生成(rand / randint / normal)(公開後にリンクを追加する予定)
- 三角関数と角度変換(sin / arctan2 ほか)(公開後にリンクを追加する予定)
- ファイル入出力(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