Python(行列)

2026年3月 7日 (土)

[R]後退代入法で連立方程式を解く

backsolve関数を使う。以下は連立方程式を行列で表記し、上三角行列の係数行列をA、定数項行列をy、求める解をxとおき、x = Ayと考えてxを求めた例。backsolve関数だけではなく、solve関数を使った例、逆行列を求めて正規方程式を解いた結果も示したが、得られた解は同じであることがわかる。

> set.seed(6)
> mxaa <- matrix(trunc(runif(16, 1, 10)), 4, 4)
> mxaa[lower.tri(mxaa)] <- 0
> print(mxaa)
[,1] [,2] [,3] [,4]
[1,] 6 8 5 1
[2,] 0 9 1 3
[3,] 0 0 6 7
[4,] 0 0 0 3
> mxy <- matrix(trunc(runif(4, 1, 10)), 4, 1)
> print(mxy)
[,1]
[1,] 5
[2,] 7
[3,] 2
[4,] 7
> backsolve(mxaa, mxy)
[,1]
[1,] 2.0812757
[2,] 0.2654321
[3,] -2.3888889
[4,] 2.3333333
> solve(mxaa, mxy)
[,1]
[1,] 2.0812757
[2,] 0.2654321
[3,] -2.3888889
[4,] 2.3333333
> print(solve(t(mxaa) %*% mxaa) %*% (t(mxaa) %*% mxy))
[,1]
[1,] 2.0812757
[2,] 0.2654321
[3,] -2.3888889
[4,] 2.3333333

backsolve関数は、与えられた行列の上三角の成分だけを使って解く。以下のとおり、すべての成分を使って解くsolve関数とは得られた解が違うことがわかる。

> set.seed(6)
> mxaa <- matrix(trunc(runif(16, 1, 10)), 4, 4)
> mxy <- matrix(trunc(runif(4, 1, 10)), 4, 1)
> print(mxaa)
[,1] [,2] [,3] [,4]
[1,] 6 8 5 1
[2,] 9 9 1 3
[3,] 3 9 6 7
[4,] 4 7 9 3
> print(mxy)
[,1]
[1,] 5
[2,] 7
[3,] 2
[4,] 7
> backsolve(mxaa, mxy)
[,1]
[1,] 2.0812757
[2,] 0.2654321
[3,] -2.3888889
[4,] 2.3333333
> solve(mxaa, mxy)
[,1]
[1,] 1.8801598
[2,] -1.3715047
[3,] 0.8322237
[4,] 0.5299601

2025年3月 5日 (水)

[Python]行列のアダマール積を求める

*演算子を使う。それぞれndarray型を指定する。

>>> import numpy as np
>>> mxxx = np.array([[1, 2, 3], [2, 3, 4], [2, 5, 6]])
>>> print(mxxx)
[[1 2 3]
[2 3 4]
[2 5 6]]
>>> mxxx * mxxx
array([[ 1, 4, 9],
[ 4, 9, 16],
[ 4, 25, 36]])

2025年3月 3日 (月)

[Python]行列の積を求める

行列Aと行列Bの積ABを求めるには、numpyモジュールのdot関数を使う。引数にそれぞれndarray型を指定する。行列の乗法は、左側の行列Aの列の数と右側の行列Bの行の数が一致している場合のみ求めることができる(そのような定義になっている)。左右の列数と行数が一致しない場合はエラーが発生する。

>>> import numpy as np
>>> mxaa1 = np.array([[1, 2, 3], [2, 3, 4], [2, 5, 6]])
>>> mxbb1 = np.array([[1, 0, 1], [0, 1, 0], [0, 1, 1]])
>>> print(mxaa1)
[[1 2 3]
[2 3 4]
[2 5 6]]
>>> print(mxbb1)
[[1 0 1]
[0 1 0]
[0 1 1]]
>>> np.dot(mxaa1, mxbb1)
array([[ 1, 5, 4],
[ 2, 7, 6],
[ 2, 11, 8]])
>>> mxaa2 = np.array([[1, 0, 1], [0, 1, 0]])
>>> mxbb2 = np.array([[1, 2], [0, 1], [0, -2]])
>>> print(mxaa2)
[[1 0 1]
[0 1 0]]
>>> print(mxbb2)
[[ 1 2]
[ 0 1]
[ 0 -2]]
>>> np.dot(mxaa2, mxbb2)
array([[1, 0],
[0, 1]])

2025年3月 2日 (日)

[Python]行列のスカラー倍を求める

ndarray型に*演算子を使う。それぞれスカラー(数や関数のこと)と行列を指定する。

>>> import numpy as np
>>> a = 3
>>> mxxx = np.array([[1, 2, 3], [2, 3, 4], [2, 5, 6]])
>>> print(mxxx)
[[1 2 3]
[2 3 4]
[2 5 6]]
>>> a * mxxx
array([[ 3, 6, 9],
[ 6, 9, 12],
[ 6, 15, 18]])

2025年2月28日 (金)

[Python]行列の和と差を求める

ndarray型に+演算子または-演算子を使う。行列の和と差の定義(行の数と列の数が同じ行列同士の各成分を足す、引く)から、二つの行列の行数と列数が一致しない場合はエラーが発生する。

>>> import numpy as np
>>> mxaa1 = np.array([[1, 2, 3], [6, 4, 2]])
>>> mxbb1 = np.array([[1, 1, 0], [2, 3, 8]])
>>> print(mxaa1)
[[1 2 3]
[6 4 2]]
>>> print(mxbb1)
[[1 1 0]
[2 3 8]]
>>> mxaa1 + mxbb1
array([[ 2, 3, 3],
[ 8, 7, 10]])
>>> mxaa2 = np.array([[1, 3], [2, 4]])
>>> mxbb2 = np.array([[7, 9], [5, 1]])
>>> print(mxaa2)
[[1 3]
[2 4]]
>>> print(mxbb2)
[[7 9]
[5 1]]
>>> mxaa2 - mxbb2
array([[-6, -6],
[-3, 3]])
>>> mxaa1 + mxbb2
Traceback (most recent call last):
File "", line 1, in
ValueError: operands could not be broadcast together with shapes (2,3) (2,2)
>>> mxaa1 - mxbb2
Traceback (most recent call last):
File "", line 1, in
ValueError: operands could not be broadcast together with shapes (2,3) (2,2)
無料ブログはココログ

■■

■■■