見出し画像

GCI 2023 Summer 第2回を講義メモ

今回はNumpyの基礎を扱った。あまり詳細に書くと怒られそうなのであくまでさらっとメモを残すことにする。

講義内容

  • Numpyの基本的なアイデア・演算

  • Numpyのインデックス

  • 2次元配列

  • 科学定数

  • 乱数(random)

  • 線形代数の計算(linalg)


メモ

演算

np.ndarrayの四則演算や条件演算、一部の関数は「ユニバーサル」である

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

print(A + B) # [5 7 9]
print(A * B) # [4 10 18]

print(A == B) # [False False False]
print(A < B) # [True True True]

print(np.sin(A)) # [0.84147098 0.90929743 0.14112001]
print(np.exp(A)) # [ 2.71828183  7.3890561  20.08553692]

ベクトル(行列)のスカラー倍は内部的にユニバーサル演算できるようにint型から同じ大きさのnp.ndarrayクラスに変換(ブロードキャスト)して計算される

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

print(4 * A) # [4 8 12]
# np.array([4 4 4]) * A と同じ

1次元のインデックス・スライシング

[start:end:step]
各値は省略可能、デフォルトの値はstart=0, end=-1, step=1
end「未満」であることに注意

A = np.array([5, 0, 2, 8, 3])

print(A[0]) # 5
print(A[1]) # 0
print(A[2]) # 2
print(A[-1]) # 3
print(A[-2]) # 8
print(A[-3]) # 2

print(A[1:4:1]) # [0 2 8]
print(A[1:4]) # [0 2 8]
print(A[:2:1]) # [5 0]
print(A[:2]) # [5 0]
print(A[::2])  # [5 2 3]
print(A[:]) # [5 0 2 8 3]

2次元配列(行列)

reshapeにおいて片方の値を-1にすることで、自動で大きさを決めてくれる

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

# 以下も同じ
A = np.array([1, 0, 2, 3, -1, 4, -2, 5, 2])
A = A.reshape(3, 3)

# 以下も同じ
A = np.array([1, 0, 2, 3, -1, 4, -2, 5, 2])
A = A.reshape(3, -1)

# 以下も同じ
A = np.array([1, 0, 2, 3, -1, 4, -2, 5, 2])
A = A.reshape(-1, 3)

print(A.shape) # (3, 3)

集約関数にはaxisを指定することができる。

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

# axis指定なし
print(np.max(A)) # 5

# axis指定あり
print(np.max(A, axis=0)) # [3 5 4]
print(np.max(A, axis=1)) # [2 4 5]

さらに、keepdims=Trueを指定することで、次元を保ったまま(行、列が区別されたまま)出力できる。

# axis, keepdims=True指定あり
print(np.max(A, axis=0, keepdims=True))
"""
[[3 5 4]]
"""

print(np.max(A, axis=1, keepdims=True))
"""
[[2]
 [4]
 [5]]
"""

この記事が気に入ったらサポートをしてみませんか?