NumPyによるベクトルと行列の計算


In [1]:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from pandas import Series, DataFrame

練習問題

(1) 次の (2,2)行列 m と(2,1)行列(縦ベクトル)v をarrayオブジェクトとして定義してください。また、行列の積 w = mv を計算してください。

m = [[2, 3], [4, 5]] v = [[6], [7]]

In [2]:
m = np.array([[2,3],[4,5]])
v = np.array([[6],[7]])
w = np.dot(m, v)

In [3]:
m


Out[3]:
array([[2, 3],
       [4, 5]])

In [4]:
v


Out[4]:
array([[6],
       [7]])

In [5]:
w


Out[5]:
array([[33],
       [59]])

(2) 逆行列を計算する関数 np.linalg.inv() を利用して、次の連立方程式の解を求めてください。

2x + 3y = 33 4x + 5y = 59

In [6]:
w = np.array([[33],[59]])
m_inv = np.linalg.inv(m)
answer = np.dot(m_inv, w)
answer


Out[6]:
array([[ 6.],
       [ 7.]])

(3) 次のarrayオブジェクトを「手早く」用意する方法を考えてください。

(ヒント:np.arange, reshape, T を利用します。)

array([[ 1, 6, 11, 16, 21], [ 2, 7, 12, 17, 22], [ 3, 8, 13, 18, 23], [ 4, 9, 14, 19, 24], [ 5, 10, 15, 20, 25]])

In [7]:
np.arange(1,26).reshape([5,5]).T


Out[7]:
array([[ 1,  6, 11, 16, 21],
       [ 2,  7, 12, 17, 22],
       [ 3,  8, 13, 18, 23],
       [ 4,  9, 14, 19, 24],
       [ 5, 10, 15, 20, 25]])

(4) arrayオブジェクトを受け取って、各要素を2倍する(*2 を演算する)関数 double を定義しなさい。また、(1)で定義した m を用いて、double(m) の結果を確認しなさい。


In [8]:
def double(a):
    return a*2

In [9]:
double(m)


Out[9]:
array([[ 4,  6],
       [ 8, 10]])

(5) double(m.tolist()) の結果を確認して、なぜそのような結果になったのかを考えてください。

(ヒント:tolist()メソッドは、arrayオブジェクトを通常の多次元リストに変換します。)


In [10]:
double(m.tolist())


Out[10]:
[[2, 3], [4, 5], [2, 3], [4, 5]]

「リスト * 2」は、元のリストの要素を2回並べたリストを作成します。