Data Science|Basics

PythonのNumPyの使い方を分かりやすく解説!配列の演算方法も

Pythonで機械学習やディープラーニングなどを行う際に用いられるライブラリで有名なのが「NumPy」モジュールです。

NumPyはベクトルや行列の演算を行うのに便利なライブラリとなっており、高速かつ効率的に数値計算を行うことができます。ですが、NumPyを学習している段階でつまずいてしまう人も多いです。

この記事では、NumPyの役割、使い方を分かりやすく解説します。機械学習を行う際には必須のライブラリなので、ぜひ参考にしてください。

PythonのNumPyとは

最初にPythonにおけるNumPyの役割やNumPyを使ってできることを解説します。
まずはNumPyで何ができるのかを理解して、これからの学習の指針を立てておきましょう。

NumPyの役割

NumPyは機械学習やディープラーニングを行う際に使われる拡張ライブラリです。ベクトルや行列といった数学的対象を処理するのに便利なライブラリになっています。

基本的な計算処理であればNumPyを使わずともできますが、大量のデータを処理するような場合には処理が遅くなるため、高速な数値計算が必要な場合にはNumPyを使うことが多いです。

つまり、NumPyはベクトルや行列の計算を高速に処理するためのライブラリと覚えておけば大丈夫です。

ライブラリとは

NumPyは「ベクトルや行列を処理するためのライブラリ」だと書きました。では「ライブラリ」とは何なのでしょうか。

Pythonを使っていると、NumPyだけでなく他にも多くのライブラリを使用することになります。そこで、ライブラリについても簡単に理解しておきましょう。

ライブラリとは、クラスや関数がまとめられたものです。簡単に言えば、Pythonに拡張機能を提供してくれるものと思ってください。ライブラリは「モジュール」「パッケージ」と呼ばれることもあります。

今回のNumPyは数値計算を効率的に行うための機能をまとめたものになっています。

ライブラリにはPython公式が用意した「標準ライブラリ」とユーザーが作成・配布している「外部ライブラリ」または「サードパーティライブラリ」がありますが、NumPyは外部ライブラリに該当します。

NumPyでできること

NumPyを使用することによって、ベクトルや行列の演算、乱数生成など様々なことができるようになります。通常のPythonで処理を行うよりもずっと早く処理できるので、大量のデータを扱う機械学習ではNumPyが利用されるのです。

基本的には、数値計算を高速で行うことができると覚えておけば問題ありません。

NumPyの基本的な使い方

それではNumPyの基本的な使い方を解説します。
まずは基本をマスターしておくことが大事なので、ここで理解しておきましょう。

import numpy as np

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

◯実行結果

[1 2 3]

上記のコードがNumPyの基本的な使い方です。

まず、NumPyは外部ライブラリなので、import文を使ってNumPyを使えるようにする必要があります。それが1行目の「import numpy as np」です。

NumPyを呼び出すときはnpと名前をつけるのが一般的になっているので、変更する理由がなければ「as np」としてNumPyを読み込みましょう。

ここではリスト[1,2,3]をnp.array関数に渡して配列[1 2 3]を生成、print関数で表示させています。

これが基本的なNumPyの使い方になります。NumPyを読み込まなければnp.array関数を使用することはできないので、1行目の「import numpy as np」を忘れないようにしましょう。

NumPyの実践方法・具体例

それでは、実際にNumPyでの具体的な配列の作り方や計算方法を解説していきます。
途中で分からなくなったときには、先ほど説明したNumPyの基本的な使い方を見直してみてくださいね。

配列とは

NumPyでの配列について説明していく前に、配列とは何かを簡単に説明しておきましょう。

配列とは、複数のデータを1つにまとめたものを指します。たくさんのデータを収納することのできる箱をイメージしてみてください。箱の中のデータのそれぞれを「要素」と呼び、各要素は「添字」または「インデックス」と呼ばれる番号で区別します。

1つ目の要素の添字が0となり、続いて1、2、3、…と自動的に番号が振られていきます。変数のようにそれぞれのデータに名前を付けることができない代わりに、配列の名前と対応する添字でデータを呼び出すことになります。

まとめると、

  • 複数のデータをまとめたものが「配列」
  • 配列に格納されたそれぞれのデータが「要素」
  • 要素を呼び出すときに使われるのが「添字」

と覚えておいてください。

配列についてはこちらの記事でも詳しく解説しています!

【初心者向け】Pythonの配列をマスターしよう!配列操作を一挙解説!「Pythonの配列の使い方がわからない」 「配列を使うと複数のデータを格納できるらしいけど、格納したデータをどうやって使えば良いの?...

1次元配列と多次元配列

NumPyでは1次元配列や2次元・3次元配列のような多次元配列が頻繁に出てきます。
そこで配列の作り方を説明する前に、1次元配列と多次元配列について解説しておきます。

まずは1次元配列です。これが基本的な配列になります。次の例を見てください。

a = [1,2,3]

これは3つのデータ「1」「2」「3」が入った1次元配列です。「a」という1つの箱の中に3つのデータがあります。この配列の0番目の要素「1」を呼び出すには「a[0]」とします。
1次元配列はイメージ通りで分かりやすいですね。

次に2次元配列ですが、コードで記述すると次のようになります。

b = [[1,2,3],[4,5]]

これは2つの配列「[1,2,3]」と「[4,5]」が入った2次元配列です。「b」という箱の中に、さらに2つの箱が入っているイメージですね。

この配列の中のデータ「3」は、第0要素「[1,2,3]」の第2要素になっています。そこでこのデータを呼び出すには「b[0][2]」とします。

2次元配列を考えるときには、オセロのようなマス目をイメージすると分かりやすいですね。

3次元配列では次のようになります。

c = [[[1,2,3],[4,5]],[[6,7,8,9],[10],[11,12]]]

この3次元配列cには2つの2次元配列「[1,2,3],[4,5]」と「[6,7,8,9],[10],[11,12]」が要素として入っています。1次元配列としては合計で5個が入っていることになりますね。

この配列の中のデータ「8」は第1要素「[6,7,8,9],[10],[11,12]」の第0要素「[6,7,8,9]」の中にあり、その第2要素になっています。そこでこのデータを呼び出すには「c[1][0][2]」とします。
言葉にすると少し複雑ですが、実は難しいことではないので、自分で確認してみてくださいね。

3次元配列を考えるときには、ルービックキューブをイメージしてみてください。

このように、多次元配列とは「配列が入った配列」と考えることができます。入れ子になったたくさんの箱をイメージしてくださいね。

配列の作り方

それでは実際にNumPyでの配列の作り方をサンプルコードで解説していきます。

配列の作り方は先ほど基本的な使い方で説明した通りです。

import numpy as np

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

実行結果

[1 2 3]

これが1次元配列の作り方です。

ここで、配列がどのようにできているかを確認できるshape属性を使用して、配列の形状を確認してみます。上のコードに次のコードを追加してみましょう。

print(x.shape)

〇実行結果

(3,)

この結果は要素が3つ格納されていることを表しています。
数学的には、1次元配列は1次行列、すなわちベクトルに対応します。

多次元配列も同じように作ることができます。
まずは2次元配列を作ってみましょう。

import numpy as np

x = np.array([[1,2],[3,4],[5,6]])
print(x)

実行結果

[[1 2]
[3 4]
[5,6]]

shape属性を使ってみると、(3,2)と表示されます。

print(x.shape)

実行結果

(3,2)

数学的には、2次元配列は2次行列に対応します。上の結果は、配列として3×2の行列ができたことを意味します。

3次元配列の場合も同様です。

import numpy as np

x = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
print(x)

実行結果

[[[ 1  2  3]
[ 4  5  6]][[ 7  8  9]
[10 11 12]]]

 

同じように、shape属性を使って形状の確認をしてみましょう。

print(x.shape)

実行結果

(2,2,3)

これは2×2×3の3次行列ができたことを意味します。

配列の計算方法

次に配列を計算処理する方法を解説します。
まずは先ほどと同じように2次元配列を作ります。

import numpy as np

x = np.array([[1,2],[3,4]])
print(x)

実行結果

[[1 2]
[3 4]]

この配列の各要素に1を加算するコードを書きましょう。上のコードに追加して、次のように書いてください。

x1 = x + 1
print(x1)

実行結果

[[2 3]
[4 5]]

このように、配列そのものに1を足すと、そのすべての要素に1が足されます。
引き算、掛け算、割り算についても同じように計算することができます。

配列同士の計算方法

次に配列同士を計算する方法を解説します。

import numpy as np

x1 = np.array([[1,2],[3,4]])
x2 = np.array([[10,20],[30,40]])
x3 = x1 + x2
print(x3)

実行結果

[[11 22]
[33 44]]

これが配列同士を計算する場合のサンプルコードになります。
配列同士の四則演算は配列の同じ位置にある要素同士で計算されます。この場合でも引き算、掛け算、割り算について同じように計算できます。

配列同士の計算方法|行が足りない場合

配列同士の計算ですが、それぞれの配列のサイズが異なる場合はどのように処理されるのでしょうか。結論から言うと、サイズの違う配列同士の計算では足りない要素が自動的に補完されます。
次のコードを見てください。

import numpy as np

x1 = np.array([[1,2],[3,4]])
x2 = np.array([10,20])
x3 = x1 + x2
print(x3)

実行結果

[[11 22]
[13 24]]

この例では2次元配列と1次元配列の和を取っていますが、問題なく計算できています。結果を見れば分かるように、1次元配列「[10,20]」が自動的に2次元配列「[10,20],[10,20]」に変換されて計算がされているのです。
このように、計算時に足りない要素を自動的に補完することをブロードキャストと言います。

配列同士の計算方法|列が足りない場合

行に数値が足りないときと同じく、列に数値が足りないときにもブロードキャストが行われます。

import numpy as np

ⅹ1 = np.array([1,2,3],[4,5,6]])
ⅹ2 = np.array([[10],[20]])
x3 = x1 + x2
print(x3)

実行結果

[[11 12 13]
[24 25 26]]

この場合、2次元配列x2「[[10],[20]]」が自動的に「[[10,10,10],[20,20,20]]」に変換されていることがわかるかと思います。

ブロードキャストが行われる条件として、演算対象になる配列同士の列または行のどちらかが同じであることが条件になります。

まとめ

Pythonの外部ライブラリであるNumPyは機械学習や深層学習を行うにあたって必要不可欠なものになっています。

これからNumPyを勉強していてつまずいたときには、この記事を読んで基礎を見直してみてくださいね。

このブログでは他にもPythonの学習に役立つ情報を発信しています!ぜひご覧ください。

Pythonで機械学習を始めよう!サンプルコードで始め方を解説Pythonでできる機械学習の例やゼロから始める手順をサンプルコード付きで紹介します。Python入門・基礎学習に役立つ本と学習サイトもまとめました。Pythonで機械学習をしたい方は必見です。...