NumPy(ナンパイまたはナムパイと読む、Numerical Pythonに由来)は、数値計算を効率的に行うためのPythonの有名なライブラリです。
一般にライブラリを使用する際は
import ライブラリ名 as 別名
のように書くことを以前に学習しましたが、NumPyは慣例的に次のようにインポートします。
import numpy as np
これで、np.関数名(...)
の形で、NumPyに用意された様々な関数を使えるようになります。
NumPyにおいて中心となるのは、Pythonの通常のリストを拡張した概念である多次元配列です。以下では、その使い方について詳しく見ていきます。
x = np.array([1,2,3,4,5]) #1次元配列(数列、ベクトル)
print(x)
print(type(x)) #オブジェクトの型
print(x.shape) #形状
print(x.ndim) #次元
print(x.size) #要素数
[1 2 3 4 5] <class 'numpy.ndarray'> (5,) 1 5
y = np.array([[1,2,3],[4,5,6],[7,8,9]]) #2次元配列(行列)
print(y)
print(type(y)) #オブジェクトの型
print(y.shape) #形状
print(y.ndim) #次元
print(y.size) #要素数
[[1 2 3] [4 5 6] [7 8 9]] <class 'numpy.ndarray'> (3, 3) 2 9
z = np.array([[[1,1],[1,1]],[[2,2],[2,2]]]) #3次元配列(今後は登場しないので、参考程度に)
print(z)
print(type(z)) #オブジェクトの型
print(z.shape) #形状
print(z.ndim) #次元
print(z.size) #要素数
[[[1 1] [1 1]] [[2 2] [2 2]]] <class 'numpy.ndarray'> (2, 2, 2) 3 8
ここで、shape
、ndim
、size
はそれぞれ、NumPyの多次元配列がもつ属性(オブジェクトと結びついた値)です。
また、特殊な1次元配列として、等差数列(区間の等分割)を作成する関数np.linspace
が用意されています。
x = np.linspace(0,1,11) #np.linspace(a,b,n):aからbまで要素数nの等差数列
print(x)
[0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1. ]
配列の要素(成分)へのアクセスは、次のように角括弧[]
を用いて行います。リストと同様に、番号は1ではなく0から数えることに注意してください。
x = np.array([1,2,3,4,5])
print(x)
print(x[1]) #1番目の要素
x[0] = 10 #0番目の要素の変更
print(x)
[1 2 3 4 5] 2 [10 2 3 4 5]
A = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(A)
print(A[1,1]) #1行目1列目の要素
print(A[0,:]) #0行目(「:」は全てを意味する、A[0]でも同じ)
print(A[:,2]) #2列目(「:」は全てを意味する)
A[:,2] = 0 #2列目の変更
print(A)
[[1 2 3] [4 5 6] [7 8 9]] 5 [1 2 3] [3 6 9] [[1 2 0] [4 5 0] [7 8 0]]
NumPyの配列に対して次のように加減乗除などを行うと、要素ごとの計算を一括で行うことができます。
A = np.array([[1,2],[3,4]])
B = np.array([[2,3],[4,5]])
print(A)
print(B)
print()
print(A+B) #要素ごとに和をとる
print(A-B) #要素ごとに差をとる
print(A*B) #要素ごとに積をとる(行列としての積ではない)
print(A/B) #要素ごとに商をとる(逆行列は関係ない)
print(2*A) #要素ごとにスカラー倍する
print(A**2) #要素ごとにべき乗する(行列としてのべき乗ではない)
[[1 2] [3 4]] [[2 3] [4 5]] [[3 5] [7 9]] [[-1 -1] [-1 -1]] [[ 2 6] [12 20]] [[0.5 0.66666667] [0.75 0.8 ]] [[2 4] [6 8]] [[ 1 4] [ 9 16]]
さらに、NumPyに用意された数学関数を用いると、配列の要素ごとの関数値を一度に求めることができます。
(mathライブラリの数学関数ではそのようなことはできず、エラーになります。)
A = np.array([[-1,1],[-2,2]])
print(A)
print()
print(np.sin(A)) #要素ごとにsinの値を計算する
print(np.cos(A)) #要素ごとにcosの値を計算する
print(np.exp(A)) #要素ごとにeを底とする指数関数の値を計算する
print(np.abs(A)) #要素ごとに絶対値を計算する
[[-1 1] [-2 2]] [[-0.84147098 0.84147098] [-0.90929743 0.90929743]] [[ 0.54030231 0.54030231] [-0.41614684 -0.41614684]] [[0.36787944 2.71828183] [0.13533528 7.3890561 ]] [[1 1] [2 2]]
これを利用すると、第6回の授業では少し手間が掛かっていた関数のグラフの描画を、簡潔なコードで行うことができます。
import matplotlib.pyplot as plt #グラフの描画のためのライブラリ
x = np.linspace(0,2*np.pi,101) #np.piは円周率
y = np.sin(x)
plt.plot(x,y,"-",label="$y=\sin x$") #折れ線グラフの描画
plt.grid()
plt.legend()
plt.show()
次の関数のグラフを描画してください。
$$ y=\sin x^3 \cos x+1, \quad 1\leq x\leq 2 $$#演習1のコード
import numpy as np
import matplotlib.pyplot as plt
#ここに、コードを書く
NumPyの2次元配列は、行列に対応しています。要素ごとの加減乗除などの計算については上で説明しましたが、他にも以下のような行列特有の演算が可能です。
A = np.array([[1,2],[3,4]])
print("A=\n",A)
print("Aの転置行列\n",A.T)
print("Aのトレース(対角和)\n",A.trace())
print("Aの行列式\n",np.linalg.det(A))
print("Aの逆行列\n",np.linalg.inv(A))
print()
b = np.array([[1],[1]])
print("b=\n",b)
print("Aとbの積\n",A@b)
A= [[1 2] [3 4]] Aの転置行列 [[1 3] [2 4]] Aのトレース(対角和) 5 Aの行列式 -2.0000000000000004 Aの逆行列 [[-2. 1. ] [ 1.5 -0.5]] b= [[1] [1]] Aとbの積 [[3] [7]]
次の行列 $A$ とベクトル $b$ に対して、方程式 $Ax=b$ の解 $x$ を求めてください。
$$ A= \begin{pmatrix} 2 & 1 & 0\\ 1 & 2 & 1\\ 0 & 1 & 2 \end{pmatrix} ,\quad b= \begin{pmatrix} 1\\ 2\\ 3 \end{pmatrix} $$#演習2のコード
import numpy as np
#ここに、コードを書く
#逆行列np.linalg.inv(A)を用いればよい
演習1~演習2に取り組んでください。