数値計算ライブラリ numpyとは?
numpyはPythonで数値を扱う時に非常に役に立つライブラリです。
何が役に立つかと言うと、ある数字をリスト内の数字全てに対して計算したり、2つのリスト同士の計算が出来たり。
さらには前回紹介したrangeと同様の関数があり、numpyでは少数の連番を作れるといった利点があります。
今回はnumpyの基本編ということで、この少数の連番に関しては割愛しますが、そのうちに紹介したいなと思っています。
扱う数値の数が少なければ、これまでのスタンダードなリストや四則演算で計算していけるのでしょうが、数が多くなればなるほど、数値計算に特化したライブラリであるnumpyは力を発揮してくれることでしょう。
同様のことが他のライブラリにも言え、通常はスタンダードなライブラリ・関数を使い、特別な処理をする際は、特化したライブラリを用いるため、どんなライブラリがあるのか知っておくことは今後のプログラミングに役に立ってくれることでしょう。
インポートして、numpyのリストを作ってみる
numpyはAnacondaをインストールした人は最初からインストールされています。
ただ使用するにはインポートが必要です。
import numpy as np
このコードにより、numpyのインポートが完了しますが、「as np」とあるように、今後は「np」と打つことで、「numpy」と打ったのと同じ効果が得られます。
numpyは慣例的に「np」とされるので、それに倣っておいた方がいいでしょう。
次にnumpyのリストを作ってみますが、まずは通常のリストから。
a = [1, 2, 3, 4, 5]
print(a)
実行結果
[1, 2, 3, 4, 5]
numpuのリストを作るのは、これに少々プラスするだけです。
import numpy as np
a = np.array([1, 2, 3, 4, 5])
print(a)
実行結果
[1 2 3 4 5]
numpyのリストにしたいリストをnp.array()で囲うだけでnumpyのリストに変換されます。
ちなみにnumpyのリストを通常のリストに変換する場合は、.tolist()を最後に付けます。
import numpy as np
a = np.array([1, 2, 3, 4, 5])
b = a.tolist()
print(b)
実行結果
[1, 2, 3, 4, 5]
リスト内の数値に対して、ある値を四則演算
例えばリストの中の数字全てに同じ数字を掛けたいということがあったとします。
通常のリストですと、これをやるのは少々手間が掛かります。
配列に掛け算すればいいんだろうと下のようなコードを書くと、意図しないリストが出来上がります。
a = [1, 2, 3, 4, 5]
b = a*2
print(b)
実行結果
[1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
普通のリストでは、同じリストを掛けた数の分だけ、繰り返されてしまいます。
今回意図しているものは、[1, 2, 3, 4, 5]という最初のリストに対して、[2, 4, 6, 8, 10]というように、リスト内の要素全てに同じ数が掛けられたリストです。
もしnumpyを使わずにこれを達成しようとすると、私ならこんなコードを書きます。
a = [1, 2, 3, 4, 5]
b = []
for i in a:
b.append(i*2)
print(a)
print(b)
実行結果
[1, 2, 3, 4, 5]
[2, 4, 6, 8, 10]
実行結果の上の段が2をかける前のリスト、下の段が2がかけられたリストになります。
まず b という空リストを用意して、その後、a から1つずつ要素を取り出し、2倍した数を b のリストに放り込んでいくと言う感じです。
これをnumpyを使うとこんなコードになります。
import numpy as np
a = np.array([1, 2, 3, 4, 5])
b = a*2
print(a)
print(b)
実行結果
[1 2 3 4 5]
[ 2 4 6 8 10]
通常のリストでは使えなかった、リストへ直接的に計算することが可能になるわけです。
これは掛け算だけではなく、四則演算全てが使えます。
import numpy as np
a = np.array([1, 2, 3, 4, 5])
b = a + 2
c = a - 2
d = a * 2
e = a / 2
print(a)
print(b)
print(c)
print(d)
print(e)
実行結果
[1 2 3 4 5]
[3 4 5 6 7]
[-1 0 1 2 3]
[ 2 4 6 8 10]
[0.5 1. 1.5 2. 2.5]
リスト同士を四則演算
さらにnumpyではリスト同士を計算することも可能です。
つまり2つのnumpyリストがあった場合、要素数が同じであれば、それぞれの要素を足したり、掛けたりできるわけです。
import numpy as np
a = np.array([1, 2, 3, 4, 5])
b = np.array([2, 3, 4, 5, 6])
c = a + b
d = a - b
e = a + b
f = a / b
print(c)
print(d)
print(e)
print(f)
実行結果
[ 3 5 7 9 11]
[-1 -1 -1 -1 -1]
[ 3 5 7 9 11]
[0.5 0.66666667 0.75 0.8 0.83333333]
ただし先ほども書いた通り、2つのnumpyリストの要素数が同じ場合に限ります。
異なる場合は、エラーが出力されます。
import numpy as np
a = np.array([1, 2, 3, 4, 5])
b = np.array([2, 3, 4, 5])
c = a + b
d = a - b
e = a + b
f = a / b
print(c)
print(d)
print(e)
print(f)
実行結果
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-XX-XXXXXXXXXXXX> in <module>
4 b = np.array([2, 3, 4, 5])
5
----> 6 c = a + b
7 d = a - b
8 e = a + b
ValueError: operands could not be broadcast together with shapes (5,) (4,)
2次元リストの行と列を入れ替える
numpyで2次元リストを作ると、表のように出力されます。
import numpy as np
a = np.array([[1, 2], [3, 4], [5, 6]])
print(a)
実行結果
[[1 2]
[3 4]
[5 6]]
この行と列を入れ替えたい時、役に立つ関数がtransposeです。
tabulateを紹介した時に、ちょこっとだけ紹介しました。
とりあえず使ってみるとこんな感じになります。
import numpy as np
a = np.array([[1, 2], [3, 4], [5, 6]])
b = a.transpose()
print(b)
実行結果
[[1 3 5]
[2 4 6]]
transpose関数を使うと、上の例のように、それぞれのリストの1番目の要素を取り新たなリストを、さらに2番目の要素を取り新たなリストを作成し、結果、行と列が入れ替わったリストを作ることが出来ます。
ちなみに最初から行と列を入れ替えたいなら、こんな書き方でも大丈夫です。
import numpy as np
a = np.array([[1, 2], [3, 4], [5, 6]]).transpose()
print(a)
実行結果
[[1 3 5]
[2 4 6]]
もしくは表示する時だけ、行と列を入れ替えたい場合は、こうしてもOK。
import numpy as np
a = np.array([[1, 2], [3, 4], [5, 6]])
print(a.transpose())
実行結果
[[1 3 5]
[2 4 6]]
ちなみに行と列の数が揃っていないと、エラーは出ないものの、正しく行と列の入れ替えが行われないようです。
import numpy as np
a = np.array([[1, 2], [3, 4], [5]])
b = a.transpose()
print(b)
実行結果
[list([1, 2]) list([3, 4]) list([5])]
1次元や3次元のリストでも使えるようですが、使うのは2次元リストだと思うので、とりあえずtranspose関数はこんな感じで。
またnumpyは数値を扱う人は多分、よくお世話になるライブラリでしょう。
何となく難しそうだなぁと思いつつ、使えるところは積極的に使っていくのがオススメです。
次回はグラフ表示に用いるライブラリ、matplotlibに関して解説をしていきます。
ということで今回はこんな感じで。
コメント