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


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

In [2]:
theta = np.pi / 3
m = np.array([[np.cos(theta),-np.sin(theta)],
              [np.sin(theta),np.cos(theta)]])
m


Out[2]:
array([[ 0.5      , -0.8660254],
       [ 0.8660254,  0.5      ]])

In [3]:
np.dot(m, m)


Out[3]:
array([[-0.5      , -0.8660254],
       [ 0.8660254, -0.5      ]])

In [4]:
np.linalg.inv(m)


Out[4]:
array([[ 0.5      ,  0.8660254],
       [-0.8660254,  0.5      ]])

In [5]:
m.T


Out[5]:
array([[ 0.5      ,  0.8660254],
       [-0.8660254,  0.5      ]])

In [6]:
x = np.array([[1],[0]])
x


Out[6]:
array([[1],
       [0]])

In [7]:
n = np.dot(m,x)
n


Out[7]:
array([[ 0.5      ],
       [ 0.8660254]])

In [8]:
a = np.array([[-1],[0],[1]])
b = np.array([[2],[3],[5]])

np.dot(a.T, b)


Out[8]:
array([[3]])

In [9]:
np.dot(a, b.T)


Out[9]:
array([[-2, -3, -5],
       [ 0,  0,  0],
       [ 2,  3,  5]])

In [10]:
np.dot(a.T, b)[0][0]


Out[10]:
3

In [11]:
m = np.array([[1,2],[3,4]])
m


Out[11]:
array([[1, 2],
       [3, 4]])

In [12]:
2*m


Out[12]:
array([[2, 4],
       [6, 8]])

In [13]:
m*2


Out[13]:
array([[2, 4],
       [6, 8]])

In [14]:
m**2


Out[14]:
array([[ 1,  4],
       [ 9, 16]])

In [15]:
m+10


Out[15]:
array([[11, 12],
       [13, 14]])

In [16]:
[1,2,3] * 2


Out[16]:
[1, 2, 3, 1, 2, 3]

In [17]:
np.array([1,2,3]) * 2


Out[17]:
array([2, 4, 6])

In [18]:
def square(x):
    if isinstance(x, list):
        x = np.array(x)
    return x**2

In [19]:
square(3)


Out[19]:
9

In [20]:
square([1,2,3])


Out[20]:
array([1, 4, 9])

In [21]:
square(np.array([1,2,3]))


Out[21]:
array([1, 4, 9])

In [22]:
def square(x):
    return x**2

square(np.array([1,2,3]))


Out[22]:
array([1, 4, 9])

In [23]:
a = np.array([[10,20],[30,40]])
a


Out[23]:
array([[10, 20],
       [30, 40]])

In [24]:
b = np.array([[1,2],[3,4]])
b


Out[24]:
array([[1, 2],
       [3, 4]])

In [25]:
a+b


Out[25]:
array([[11, 22],
       [33, 44]])

In [26]:
a-b


Out[26]:
array([[ 9, 18],
       [27, 36]])

In [27]:
a**b


Out[27]:
array([[     10,     400],
       [  27000, 2560000]])

In [28]:
np.zeros((3,3))


Out[28]:
array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])

In [29]:
np.ones((2,3))


Out[29]:
array([[ 1.,  1.,  1.],
       [ 1.,  1.,  1.]])

In [30]:
np.eye(4)


Out[30]:
array([[ 1.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.],
       [ 0.,  0.,  1.,  0.],
       [ 0.,  0.,  0.,  1.]])

In [31]:
a = np.array([1,2,3,4,5,6])
a


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

In [32]:
b = a.reshape((2,3))
b


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

In [33]:
c = b.reshape((3,2))
c


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

In [34]:
b.shape


Out[34]:
(2, 3)

In [35]:
c.shape


Out[35]:
(3, 2)

In [36]:
x = [1,2,3,4]
np.array(x).reshape(len(x),1)


Out[36]:
array([[1],
       [2],
       [3],
       [4]])

In [37]:
np.array([x])


Out[37]:
array([[1, 2, 3, 4]])

In [38]:
np.array([x]).T


Out[38]:
array([[1],
       [2],
       [3],
       [4]])

In [39]:
np.arange(0, 1, 0.1)


Out[39]:
array([ 0. ,  0.1,  0.2,  0.3,  0.4,  0.5,  0.6,  0.7,  0.8,  0.9])

In [40]:
a = np.ones(9).reshape((3,3))
a


Out[40]:
array([[ 1.,  1.,  1.],
       [ 1.,  1.,  1.],
       [ 1.,  1.,  1.]])

In [41]:
b = a*2
b


Out[41]:
array([[ 2.,  2.,  2.],
       [ 2.,  2.,  2.],
       [ 2.,  2.,  2.]])

In [42]:
np.vstack((a,b))


Out[42]:
array([[ 1.,  1.,  1.],
       [ 1.,  1.,  1.],
       [ 1.,  1.,  1.],
       [ 2.,  2.,  2.],
       [ 2.,  2.,  2.],
       [ 2.,  2.,  2.]])

In [43]:
np.hstack((a,b))


Out[43]:
array([[ 1.,  1.,  1.,  2.,  2.,  2.],
       [ 1.,  1.,  1.,  2.,  2.,  2.],
       [ 1.,  1.,  1.,  2.,  2.,  2.]])

In [44]:
a = np.array([-1, 0, 1])
b = np.array([ 1, 2, 3])
np.dot(a, b)


Out[44]:
2

In [45]:
m = np.array([1,1,1,2,2,2,3,3,3]).reshape(3,3)
m


Out[45]:
array([[1, 1, 1],
       [2, 2, 2],
       [3, 3, 3]])

In [46]:
np.dot(m,a)


Out[46]:
array([0, 0, 0])

In [47]:
np.dot(a,m)


Out[47]:
array([2, 2, 2])

練習問題

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

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

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

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

(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]])

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

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

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