今日は前回の続きだよー。
Pythonを動かしてみよう
今日は、NumPyの配列とベクトル演算について、お勉強しましょう。前回書いたプログラムはこのようなものでした。
import numpy as np
a = np.array([12, 3, 2, 16, 27, 1, 15, 9, 10, 8])
b = np.array([7, 2, 1, 4, 5, 9, 3, 3, 6, 8])
print(a+b)
np.arrayで表現される数字の集まりを配列と言うよ。
そして、Pythonが計算した答えは
[19 5 3 20 32 10 18 12 16 16]
でした。これは、aの最初の12とbの最初の7を足して、12+7=19、2番目を足して、3+2=5、…といった同じ場所にある数同士の足し算の答えです。このような計算をベクトル演算と言います。NumPyは、配列をベクトル演算することで、高速で効率の良い計算を実現しています。
1列に数字が並んでいる配列は、1次元配列と呼ばれます。一次元配列aを2段にして、2次元配列を作って見ましょう。
In [2]: c = a.reshape(2,5)
In [3]: c
Out[3]:
array([[12, 3, 2, 16, 27],
[ 1, 15, 9, 10, 8]])
aの10個の数字が、前半の5個と後半の5個に分かれて、2段になりました。
Pythonは0から数え始めるよ。1段目をc[0]、2段目をc[1]と表すよ。左から何番目というのも、0から数えるよ。c[0,0]は1段目の一番左の数字という意味だから、c[0,0]=12になるよ。
In [4]: c[0]
Out[4]: array([12, 3, 2, 16, 27])
In [5]: c[0,0]
Out[5]: 12
3次元配列って、どんなものなの?
10個の数字だと説明しにくいから、別の例で考えようね。例えば、3階建で、南側に5部屋、北側に5部屋あるビルを思い浮かべてみてね。この建物は、配列で言うと、3×2×5の3次元配列になっているよ。
In [6]: d = np.arange(30).reshape(3,2,5)
In [7]: d
Out[7]:
array([[[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9]],
[[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]],
[[20, 21, 22, 23, 24],
[25, 26, 27, 28, 29]]])
np.range(30)は、0,1,2,…と一つずつ数が増えるように30個の数字を並べた1次元配列だよ。
reshape(3,2,5)を使って、最初の10個の部屋(0号室から9号室)を1階南側に5部屋・北側に5部屋、次の10個の部屋(10号室から19号室)を2階南側に5部屋・北側に5部屋、その次の10個の部屋(20号室から29号室)を3階南側に5部屋・北側に5部屋、割り当てたイメージだよ。
1階の部屋番号だけを見たければ、d[0]を見れば良いんだね。
その通りだよ。さらに、1階の南側の部屋番号だけを見たければ、d[0,0]とすると、array([0, 1, 2, 3, 4])が答えとして返ってくるよ。さらにd[0,0,0]とすると、1階の南側の一番最初の部屋番号の0が答えとして返ってくるよ。
次の例を使って、二つの3次元配列の掛け算を考えてみましょう。3次元配列の掛け算も、同じ場所にある数字同士の掛け算になります。
In [8]: d1 = np.arange(1,9).reshape(2,2,2)
In [9]: d1
Out[9]:
array([[[1, 2],
[3, 4]],
[[5, 6],
[7, 8]]])
In [10]: d2 = np.arange(20,4,-2).reshape(2,2,2)
In [11]: d2
Out[11]:
array([[[20, 18],
[16, 14]],
[[12, 10],
[ 8, 6]]])
In [12]:d1*d2
Out[12]:
array([[[20, 36],
[48, 56]],
[[60, 60],
[56, 48]]])
np.arange(1,9)は、1から8までの整数(9は入らない)、np.arange(20,4,-2)は、20から2ずつ減らした数(4の手前まで)です。d1*d2の答えは、[0,0,0]の位置から順に、1×20=20, 2×18=36, 3×16=48, 4×14=56, …となります。
多次元配列は、どのような時に役に立つのでしょうか。
意外と身近なところで役に立っています。一つの例として、新型コロナ感染症の新規感染者数のデータが挙げられます。何月何日、どこの都道府県で、どちらの性別で、何歳の人が、何人新規に感染したか、という一年分のデータは365(日)×47(都道府県)×2(男女)×117(0歳から116歳)の4次元配列のデータにすることができます。配列として扱うことで、驚くほどのスピードでデータを分析をすることができます。
次回は、NumPyの配列のスライシング(抽出)を学びながら、さらに配列の構造に慣れていきましょう。
今日のお勉強は、だいぶ難しかったなー。