はじめに
セルフ夏期講習として、NumPy 100本ノックに取り組んだ。今回はQ1からQ22まで進めたので、途中経過を記録する。
教材は英語で書かれているため、英語の問題文と日本語訳を併記したPythonファイルを用意した。VS CodeのPython Interactiveで1問ずつ実行できるように、問題文をMarkdownセル、回答欄をコードセルとして# %%で区切っている。
今回の進捗
- NumPyの読み込み、バージョン・設定の確認(Q1〜Q2)
- 配列の作成、メモリサイズ、ドキュメントの確認(Q3〜Q6)
- 配列の反転、変形、非ゼロ要素の取得(Q7〜Q10)
- 単位行列、乱数、最小値・最大値・平均値(Q11〜Q14)
-
スライス、パディング、
NaNなどの挙動確認(Q15〜Q17) - 対角行列、市松模様、インデックス変換、標準化(Q18〜Q22)
- Q23〜Q100
今回学んだこと
配列の形とスライスを意識する
reshape()、スライス、np.tile()を使う問題では、処理前後のshapeを考えることが重要だった。
例えば、市松模様は2×2の小さなパターンを縦横に4回ずつ繰り返すと、8×8の配列になる。
checkerboard = np.tile(
np.array([[0, 1], [1, 0]]),
(4, 4),
)
関数の戻り値の形も確認する
Q10で使用したnp.nonzero()は、条件に合うインデックスを配列の次元ごとにまとめたタプルを返す。1次元配列でも、結果が(array([...]),)の形になることが分かった。
values = np.array([1, 2, 0, 0, 4, 0])
np.nonzero(values)
# (array([0, 1, 4]),)
表示だけで判断せず、戻り値の型と構造まで確認する必要がある。
平均0・標準偏差1への標準化
Q22では、各要素から平均値を引き、標準偏差で割ることで5×5行列を標準化した。
matrix = np.random.random((5, 5))
standardized = (matrix - matrix.mean()) / matrix.std()
NumPyでは、配列全体の平均値や標準偏差をメソッドで求め、そのまま配列の各要素との計算に使える。配列とスカラーの計算が各要素へ適用されることを、実際のコードで確認できた。
特殊な値と浮動小数点数の挙動
NaNは自分自身との比較でも等しくならず、0.3 == 3 * 0.1も浮動小数点数の内部表現によってFalseになる。見た目が同じ値でも、単純な等価比較が期待どおりにならない場合があることを確認した。
感想
Q1〜Q14は配列作成や基本的な集計が中心だったが、Q15以降はスライス、パディング、特殊な数値、複数次元のインデックスなど、配列の構造を考える問題が増えてきた。
短いコードでも、配列の形、戻り値の型、計算結果を一つずつ確認すると理解しやすい。まだQ22までなので、残りも途中経過を記録しながら進めていく。