NumPy

NumPy Quickstart チュートリアルに取り組む (1-4) 基本 基本操作

基本操作

配列に対する算術演算子は、要素ごとに適用される。新しい配列が作成され、その結果を埋めて返す。

import numpy as np

a = np.array([20, 30, 40, 50])
b = np.arange(4)
print(b)  # [0 1 2 3]

c = a-b
print(c)  # [20 29 38 47]

print(b**2)  # [0 1 4 9]

print(10*np.sin(a))  # [ 9.12945251 -9.88031624  7.4511316  -2.62374854]

print(a < 35)  # [ True  True False False]

多くの行列言語とは異なり、NumPy 配列では積演算子 * が要素毎に動作する。行列の積は @ 演算子 (python >=3.5) または dot 関数やメソッドを使って実行できる。

import numpy as np

A = np.array([[1, 1],
              [0, 1]])
B = np.array([[2, 0],
              [3, 4]])

print(A * B)
'''
[[ 2 0 ]
 [ 0 4 ]]
'''

print(A @ B)
'''
[[ 5 4 ]
 [ 3 4 ]]
'''

print(A.dot(B))
'''
[[ 5 4 ]
 [ 3 4 ]]
'''

+= や *= のような操作は、新しい配列を作成せず、既存の配列を変更する。

import numpy as np
rg = np.random.default_rng(1)
a = np.ones((2, 3), dtype=int)
b = rg.random((2, 3))
a *= 3
print(a)
'''
[[ 3 3 3 ]
 [ 3 3 3 ]]
'''

b += a
print(b)
'''
[[ 3.51182162 3.9504637  3.14415961 ]
 [ 3.94864945 3.31183145 3.42332645 ]]
'''

# b は自動的に整数型に変換されない
# a += b

異なる型の配列を操作する場合に得られる配列の型はアップキャスティングされる(より一般的なもの、より正確なものに対応する)

import numpy as np
from numpy import pi

a = np.ones(3, dtype=np.int32)
b = np.linspace(0, pi, 3)
print(b.dtype.name)  # float64

c = a+b
print(c)  # [ 1.         2.57079633 4.14159265]

print(c.dtype.name)  # float64

d = np.exp(c*1j)
print(d)  # [ 0.54030231+0.84147098j -0.84147098+0.54030231j -0.54030231-0.84147098j]

print(d.dtype.name)  # complex128

配列の全要素の合計を計算するなどの多くの単項演算は ndarray クラスのメソッドとして実装されている。

import numpy as np
rg = np.random.default_rng(1)
a = rg.random((2, 3))
print(a)
'''
[[0.51182162 0.9504637  0.14415961]
 [0.94864945 0.31183145 0.42332645]]
'''

print(a.sum())  # 3.290252281866131
print(a.min())  # 0.14415961271963373
print(a.max())  # 0.9504636963259353

# デフォルトではこれらの操作は、数値のリストであるかのように適用される。
# axis パラメータを指定することで、配列の指定した軸に沿って操作を適用することができる。

b = np.arange(12).reshape(3, 4)
print(b)
'''
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
'''

print(b.sum(axis=0))  # [12 15 18 21] 
print(b.min(axis=1))  # [0 4 8]
print(b.cumsum(axis=1)) 
'''
[[ 0  1  3  6]
 [ 4  9 15 22]
 [ 8 17 27 38]]
'''