DATA / LESSON 01

NumPyで数をまとめる

一つずつ計算する代わりに、並んだ数へ同じ計算をまとめて行おう。

図から学ぶ
NumPyで数をまとめるを表すキャラクターと学習内容のイラスト
TODAY'S GOAL

この回でつかむこと

配列の形と要素ごとの計算を説明できる。

ことばの窓
01 / SEE THE IDEA

NumPyで数をまとめるって何だろう?

NumPyのndarrayは、同じ種類の値を並べて計算するための道具です。shapeは配列の形を示します。1次元に3個なら(3,)、2行3列の表なら(2, 3)です。

あおい

りんご3個の重さに、それぞれ10gを足したいな。1個ずつ計算するの?

AI先生

いい気づきだね。配列を使うと、並んだ数の一つひとつに同じ計算をまとめて適用できるんだよ。

はる

形を確認してから計算すると、間違いを見つけやすそうです。

3個の重さをまとめて計算。同じ位置の数に10を足す。100→110、120→130、90→100。元の数の並びはそのまま。
図1 3個の重さをまとめて計算。同じ位置の数に10を足す。100→110、120→130、90→100。元の数の並びはそのまま。

あおい へぇ、3個とも「もとの数+10」で答えが出るんだ!

図を読むと

配列に10を足すと、並んだ3つの値それぞれに10が加わる。 NumPyのndarrayは、同じ種類の値を並べて計算するための道具です。shapeは配列の形を示します。1次元に3個なら(3,)、2行3列の表なら(2, 3)です。

小さなコードで確かめるまず結果を予想しよう
import numpy as np
weights = np.array([100, 120, 90])
print(weights.shape)
print(weights + 10)
実行結果(3,) と [110 130 100]

なぜそうなる? NumPyが10を各要素へ適用する仕組みをブロードキャストと呼びます。元のweights自体は変わりません。

02 / GO ONE STEP FURTHER

2行3列の表に、3個の数を足そう

計算前の表は2行3列です。加える[10, 20, 30]は、横に並ぶ3列それぞれへ対応する3個の数です。どの数とどの数を足すか、結果を見る前に予想してみよう。

table = np.array([[1, 2, 3], [4, 5, 6]])
bonus = np.array([10, 20, 30])
print('元の表', table.shape)
print(table)
print('加える数', bonus.shape, bonus)
print('結果')
print(table + bonus)
実行結果
元の表 (2, 3)
[[1 2 3]
 [4 5 6]]
加える数 (3,) [10 20 30]
結果
[[11 22 33]
 [14 25 36]]

ここに注目 結果は、元の表の各行に[10, 20, 30]を足した新しい表です。1行目は1+10、2+20、3+30。2行目は4+10、5+20、6+30になります。元のtableは変わりません。

元の表から、1マスずつ追ってみよう

あおい

へぇ、さっきの[[11, 22, 33], [14, 25, 36]]は、足したあとの答えなんだね。もとの表はどれ?

AI先生

そうなんだよ。元の表は[[1, 2, 3], [4, 5, 6]]。横に並ぶ3個の数を、それぞれの行へ同じように足してみよう。

はる

元の表は2行3列で、加える数は3個の1次元配列ですね。列の位置をそろえれば、計算を追えます。

元の表:2行3列
123
456
加える数:横に3個
102030
結果:2行3列
112233
142536

1行目 1+10=11、2+20=22、3+30=33

2行目 4+10=14、5+20=25、6+30=36

「(2, 3)」は2行3列。一方「(3,)」は1次元に3個という意味で、1行1列ではありません。横に3個の数を各行へ対応させる計算を、ブロードキャストと呼びます。

ほかの足し方もColabで比べよう
  • table + 10:すべてのマスへ10を足す
  • table + [10, 20, 30]:列ごとに10、20、30を足す
  • table + [[10], [20]]:1行目へ10、2行目へ20を足す

横に2個の [10, 20] は、この表の横3列と位置が合わずエラーになります。ただし縦に2個並べた [[10], [20]] は計算できます。形が違えば必ずエラー、というわけではないんだよ。

03 / YOUR TURN

予想して、理由を話そう

答えを選んで、説明を確かめよう。外れても発見が一つ増えるよ。

2行目[4, 5, 6]へ[10, 20, 30]を足すと?

答えを選ぶと理由が表示されます。

04 / TRY ON COLAB

Colabで試してみよう

コードの実行はColaboratoryの実行環境で行います。まずノートブックを保存し、Colabで「ファイル → ノートブックをアップロード」から開いてください。上から順に実行し、最後に値を変えてみましょう。

保存ボタンを押しても画面は切り替わりません。通常はブラウザの「ダウンロード」フォルダに .ipynb が保存されます。見つからない場合はダウンロード履歴を確認してください。Colabの実習は小さな例から始められます。

COFFEE BREAK

身近な技術とつなげてみよう

AI先生

AI先生:画像も数の表なんだよ。白黒画像なら縦×横、カラー画像なら縦×横×色の3方向で考えられるよ。

KEY TERMS

この回の重要な用語

本文で出会った言葉を、ここで意味と一緒に振り返ろう。上の「ことばの窓」からも説明を開けるよ。

ndarray
N-dimensional arrayの略。NumPyで使う多次元配列です。
shape
配列の形を示します。(2, 3)は2行3列、(3,)は1次元に数が3個です。(3,)を1行1列とは呼びません。
ブロードキャスト
形の条件が合うとき、一方の数や数の並びを各行などに対応させ、要素ごとに計算する仕組みです。
axis
集計する方向を指定する番号です。2次元配列ではaxis=0で列ごと、axis=1で行ごとに集計します。