はじめに
この記事ではNumpyについて1から調べたことをまとめています。
Numpy配列
Numpyではn次元の配列を作成できます。
1や2などの単一の数値をスカラ、1次元の配列はベクトル、2次元の配列は行列と呼びます。
更にテンソルという概念があります。以下はWikipediaには次のように書かれています。
テンソル(英: tensor, 独: Tensor)とは、線形的な量または線形的な幾何概念を一般化したもので、基底を選べば、多次元の配列として表現できるようなものである。
例えば、質量や温度などのスカラー量は階数0のテンソルだと理解される。同様にして力や運動量などのベクトル的な量は階数1のテンソルであり、力や加速度ベクトルの間の異方的な関係などをあらわす線型変換は階数2のテンソルで表される。
自分はスカラやベクトル、行列をまとめた(一般化)したものをテンソルと呼ぶと認識しました。
Numpyの使用方法
インポート
import numpy as np
Numpyをインポートするときはエイリアスをnpとすることが多いです。
配列の生成
1次元配列(ベクトル)を生成
npArr = np.array([1, 2, 3])
print(npArr)
# [1 2 3]
2次元配列(行列)を生成
npArr = np.array([[1, 2, 3], [4, 5, 6]])
print(npArr)
# [[1 2 3]
# [4 5 6]]
3次元配列を生成
import numpy as np
npArr = np.array([
[[1, 2, 3], [4, 5, 6], [7, 8, 9]],
[[101, 102, 103], [104, 105, 106], [107, 108, 109]],
[[201, 202, 203], [204, 205, 206], [207, 208, 209]],
])
print(npArr)
# [
# [
# [ 1 2 3]
# [ 4 5 6]
# [ 7 8 9]
# ]
# [
# [101 102 103]
# [104 105 106]
# [107 108 109]
# ]
# [
# [201 202 203]
# [204 205 206]
# [207 208 209]
# ]
# ]
Numpy配列の形状
Numpy配列の形状はshapeで確認できます。
下記の例ではそれぞれが2*3
、3*3*3
の形状のNumpy配列であることがわかります。
npArr = np.array([
[1, 2, 3], [4, 5, 6]
])
print(npArr.shape)
# (2, 3)
npArr = np.array([
[[1, 2, 3], [4, 5, 6], [7, 8, 9]],
[[101, 102, 103], [104, 105, 106], [107, 108, 109]],
[[201, 202, 203], [204, 205, 206], [207, 208, 209]],
])
print(npArr.shape)
# (3, 3, 3)
要素へのアクセス
Numpy配列の要素は、インデックスを使って取得できます。
npArr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(npArr[0])
# [1 2 3]
print(npArr[0][2])
# 3
Numpyの計算
要素数が同じ配列の計算
要素数が同じ配列の計算例を下記に示します。
要素数が異なっていても計算できる場合があります(ブロードキャスト)。
ブロードキャストについては後述します。
足し算
npArr1 = np.array([1, 2, 3])
npArr2 = np.array([4, 5, 6])
print(npArr1 + npArr2)
# [5 7 9]
引き算
npArr1 = np.array([1, 2, 3])
npArr2 = np.array([4, 5, 6])
print(npArr1 - npArr2)
# [-3 -3 -3]
掛け算
npArr1 = np.array([1, 2, 3])
npArr2 = np.array([4, 5, 6])
print(npArr1 * npArr2)
# [ 4 10 18]
割り算
npArr1 = np.array([1.0, 2.0, 3.0])
npArr2 = np.array([4.0, 5.0, 6.0])
print(npArr1 / npArr2)
# [ 0.25 0.4 0.5 ]
ブロードキャスト
要素数が異なっていても計算可能な場合があります。
それは配列や行列と足したり、書けたりする要素がスカラの場合です。
スカラは配列ではなく、1つの数値を指します。例えば数値の10はスカラです。
npArr3 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(npArr3 * 10)
# [[10 20 30]
# [40 50 60]
# [70 80 90]]
上記の例では3*3
の行列に対して、10というスカラを掛けています。このとき10というスカラは行列の全ての要素に対して計算が行われます。
つまり10というスカラは、3*3
の行列として扱われていることになります。
この機能をブロードキャストと呼びます。