チャポケのブログ

勉強したことをまとめておく。

NumPy 配列に関する基本計算

スカラーと配列の四則演算

スカラー配列の四則演算は、スカラー配列の各要素の四則演算となる。

import numpy as np
aaa = np.array([[1, 2, 3, 4],
                [5, 6, 7, 8]])

print(10 + aaa) # スカラー + 配列
# [[11 12 13 14]
#  [15 16 17 18]]

print(aaa + 10) # 配列 + スカラー
# [[11 12 13 14]
#  [15 16 17 18]]

print(10 - aaa) # スカラー - 配列
# [[9 8 7 6]
#  [5 4 3 2]]

print(aaa - 10) # 配列 + スカラー
# [[-9 -8 -7 -6]
#  [-5 -4 -3 -2]]

print(10 * aaa) # スカラー * 配列
# [[10 20 30 40]
#  [50 60 70 80]]

print(aaa * 10) # 配列 * スカラー
# [[10 20 30 40]
#  [50 60 70 80]]

print(10 / aaa) # スカラー / 配列
# [[ 10.           5.           3.33333333   2.5       ]
#  [  2.           1.66666667   1.42857143   1.25      ]]

print(aaa / 10) # 配列 / スカラー
# [[ 0.1  0.2  0.3  0.4]
#  [ 0.5  0.6  0.7  0.8]]

配列と配列の四則演算

配列配列の四則演算は、配列の各要素毎の四則演算となる。

import numpy as np
aaa = np.array([[10, 20, 30, 40],
                [50, 60, 70, 80]])

bbb = np.array([[1, 2, 3, 4],
                [5, 6, 7, 8]])

print(aaa + bbb) # 配列 + 配列
# [[11 22 33 44]
#  [55 66 77 88]]

print(aaa - bbb) # 配列 - 配列
# [[ 9 18 27 36]
#  [45 54 63 72]]

print(aaa * bbb) # 配列 * 配列
# [[ 10  40  90 160]
#  [250 360 490 640]]

print(aaa / bbb) # 配列 / 配列
# [[ 10.  10.  10.  10.]
#  [ 10.  10.  10.  10.]]

算術関数:配列の各要素に個別に演算するもの

累乗関数np.power() 又は a**b
平方根np.sqrt()
指数関数np.exp()
対数関数np.log(), np.log2(), np.log10()

import numpy as np
aaa = np.array([[1, 2, 3, 4],
                [5, 6, 7, 8]])

# 累乗
print(np.power(aaa, 2)) # aaa の 2乗
print(aaa**2)           # 上式と結果は同じ
# [[ 1  4  9 16]
#  [25 36 49 64]]

print(np.power(2, aaa)) # 2 の aaa乗
print(2**aaa)           # 上式と結果は同じ
# [[  2   4   8  16]
#  [ 32  64 128 256]]

print(np.power(aaa, aaa)) # aaa の aaa乗
print(aaa**aaa)           # 上式と結果は同じ
# [[       1        4       27      256]
#  [    3125    46656   823543 16777216]]

# 平方根
print(np.sqrt(aaa)) # aaa の平方根
print(aaa**0.5)           # 上式と結果は同じ
# [[ 1.          1.41421356  1.73205081  2.        ]
#  [ 2.23606798  2.44948974  2.64575131  2.82842712]]

# 指数関数
print(np.exp(aaa)) # eのaaa乗
# [[  2.71828183e+00   7.38905610e+00   2.00855369e+01   5.45981500e+01]
#  [  1.48413159e+02   4.03428793e+02   1.09663316e+03   2.98095799e+03]]

# 対数関数
print(np.log(aaa)) # 底がe
# [[ 0.          0.69314718  1.09861229  1.38629436]
#  [ 1.60943791  1.79175947  1.94591015  2.07944154]]

print(np.log2(aaa)) # 底が2
# [[ 0.          1.          1.5849625   2.        ]
#  [ 2.32192809  2.5849625   2.80735492  3.        ]]

print(np.log10(aaa)) # 底が10
# [[ 0.          0.30103     0.47712125  0.60205999]
#  [ 0.69897     0.77815125  0.84509804  0.90308999]]

算術関数:配列の複数要素をまとめて演算するもの

総和np.sum()、最大np.max()、最小np.min()
平均np.mean()、分散np.var()標準偏差np.std()
引数にkeepdim=Trueと入れると、入力配列の次元数と同じ次元数の配列を出力する。入れないと、適宜次元数を下げたものを出力する。

import numpy as np
aaa = np.array([[1, 2, 3, 4],
                [5, 6, 7, 8]])

# 配列のすべての総和
print(np.sum(aaa, keepdims=True))
# [[36]]
print(np.sum(aaa))
# 36

# 配列の各行の総和
print(np.sum(aaa, axis=0, keepdims=True))
# [[ 6  8 10 12]]
print(np.sum(aaa, axis=0))
# [ 6  8 10 12]

# 配列の各列の総和
print(np.sum(aaa, axis=1, keepdims=True))
# [[10]
#  [26]]
print(np.sum(aaa, axis=1))
# [10 26]

下記の関数も、上記と同様にできるが省略。

# 最大
print(np.max(aaa))
# 8

# 最小
print(np.min(aaa))
# 1

# 平均
print(np.mean(aaa))
# 4.5

# 分散
print(np.var(aaa))
# 5.25

# 標準偏差
print(np.std(aaa))
# 2.29128784748

1次元の配列とベクトル、ベクトルの内積

1次元の配列で、ベクトルを表す。
ベクトルの内積は、.dot()メソッドnp.dot()関数演算子@で求める。


\left(1,2,3\right)
\cdot
\left(6,7,8\right)
=
\left(1*6+2*7+3*8\right)
=44

下記では、上式の計算を行っている。

import numpy as np

# 1次元の配列で、ベクトルを表す
vec1 = np.array([1,2,3])
vec2 = np.array([6,7,8])

# ベクトルの内積
aa = vec1.dot(vec2)
bb = np.dot(vec1, vec2)
cc = vec1 @ vec2
print(aa) # 44
print(bb) # 44
print(cc) # 44
# 上記3つの式は、同じ結果となる。

2次元の配列と行列、行列の積、行列の転置

2次元の配列で、行列を表す。
行列の積は、.dot()メソッドnp.dot()関数演算子@で求める。


\left(\begin{array}{ccc}
  1 & 2 & 3 \\
  4 & 5 & 6
\end{array}\right)
\cdot
\left(\begin{array}{c}
  30 \\
  20 \\
  10
\end{array}\right)
=
\left(\begin{array}{c}
  1*30+2*20+3*10 \\
  4*30+5*20+6*10
\end{array}\right)
=
\left(\begin{array}{c}
  100 \\
  280
\end{array}\right)

下記では、上式の計算を行っている。

import numpy as np

# 2次元の配列で、行列を表す
mtx1 = np.array([[1, 2, 3],
                 [4, 5, 6]])

mtx2 = np.array([[30],
                 [20],
                 [10]])

# 行列の積
aaa = mtx1.dot(mtx2)
bbb = np.dot(mtx1, mtx2)
ccc = mtx1 @ mtx2
print(aaa)
# [[100]
#  [280]]
print(bbb)
# [[100]
#  [280]]
print(ccc)
# [[100]
#  [280]]
# 上記3つの式は、同じ結果となる。

2次元配列の行と列を入れ替える転置は、.T属性で求める。
1次元配列に対して.T属性を使用しても、効果は特にない

import numpy as np
mtx1 = np.array([[1, 2, 3],
                 [4, 5, 6]])
ddd = mtx1.T
print(ddd)
# [[1 4]
#  [2 5]
#  [3 6]]

vec1 = np.array([1, 2, 3])
dd = vec1.T
print(dd)
# [1 2 3]