【データ分析】numpyの基本を解説!ベクトル・行列・多次元配列の生成と計算

2023-07-16

Pocket

こんにちは、爽です。皆さん、いかがお過ごしでしょうか?

今回はデータ分析でよく用いられるライブラリであるnumpyについて確認します。
numpyはpandas,matplotlibと同様にデータ分析、統計、機械学習、及びディープラーニングなどで用いられる頻度の高い重要なライプラリとなります。なお、pandasとmatplotlibの基本については以下の記事でまとめていますのでこちらも合わせてご参考ください。

・pandas

・matplotlib

■この記事の対象読者
・numpyの基本を確認したい方
・データ分析に興味のある方

なお、私はPythonをAnacondaをインストールしてJupyterで実行しています。MacのAnacondaのインストール方法とJupyterの使い方は下記記事にまとめているので良かったらご参考ください。
また、Anacondaをインストールするとインストールの時点でnumpyも同梱されるので便利です。

それではどうぞ!

numpyとは

numpyとは冒頭で記載したとおり、データ分析、統計、機械学習、及びディープラーニングなどの科学計算の場面でよく用いられるライブラリです。読み方は「ナムパイ」です。

科学計算では大量のデータを扱うのですが、numpyはそのような大量のデータを高速で処理できるのが特徴です。また、シンプルな表記で様々な計算を実装することができます。
そのような背景からnumpyはデータ分析でよく用いられています。

配列の生成

numpyではベクトルと行列、及び多次元配列を表現することができます。
ベクトルは一次元の配列で行列は二次元の配列、多次元配列は三次元以上の配列です。

numpyのimport

numpyを使う前にまずはimportします。numpyはnpと別名で略されることが多いです。

import numpy as np

ベクトル(一次元配列)

numpyで配列を作る為にはnumpyのarray()関数を用います。
また、一次元配列はarray()関数の中でリストを1つ定義すれば生成できます。

import numpy as np

#一次元配列を生成
a = np.array([0, 1, 2, 3, 4, 5])
a
# array([0, 1, 2, 3, 4, 5])

行列(二次元配列)

二次元配列はarray()関数の中でリストを二つ定義すれば生成できます。
なお、二次元配列配列はリストの外をもう1つ[]で囲う必要がります。

import numpy as np

#二次元配列を生成
b = np.array([[0, 1, 2], [3, 4, 5]])
b
# array([[0, 1, 2],
#        [3, 4, 5]])

多次元配列

行列以降の多次元配列もベクトル・行列と同様にarray()関数の中でリストを3つ以上義すれば生成できます。
なお、多次元配列以降はその次元数-1の[]が必要です。例:三次元配列は[]2つ、四次元配列は[]3つ

import numpy as np

#三次元配列を生成
c = np.array([[[0, 1, 2], [3, 4, 5], [6, 7, 8]]])
c
# array([[[0, 1, 2],
#         [3, 4, 5],
#         [6, 7, 8]]])

配列の中身の確認

配列が何次元のものか、何行何列のものかなどを確認する方法を紹介します。

c = np.array([[[0, 1, 2], [3, 4, 5], [6, 7, 8]]])

#ndimで次元数を確認
print(c.ndim)
# 3

#shapeで何行何列の配列かを確認
print(c.shape)
# (2, 2, 3)

#dtype.nameでデータ型を確認
print(c.dtype.name)
# int64

#sizeで配列の中の要素数を確認
print(c.size)
# 12

配列の演算

配列の演算は配列に数字を加算剰余する演算と配列同士の演算が可能です。

配列と数字の演算

配列と数字の演算は通常の演算のように配列に数字を加減乗除することで実行可能です。
また、配列と数字の演算は配列と各要素と数値の間で演算が行われます。

b = np.array([[0, 1, 2], [3, 4, 5]])

#各要素に加算
print(b + 3)
# [[3 4 5]
#  [6 7 8]]
#各要素から減算
print(b - 3)
# [[-3 -2 -1]
#  [ 0  1  2]]
#各要素を剰算
print(b * 3)
# [[ 0  3  6]
#  [ 9 12 15]]
#各要素を除算
print(b / 3)
# [[0.         0.33333333 0.66666667]
#  [1.         1.33333333 1.66666667]]

配列同士の演算

配列同士の演算については、同じ位置の各要素同士で演算が行われます。

b = np.array([[0, 1, 2], [3, 4, 5]])
d = np.array([[1, 2, 3], [4, 5, 6]])

#要素同士を加算
print(b + d)
# [[ 1  3  5]
#  [ 7  9 11]]
#要素bから要素dを減算
print(b - d)
# [[-1 -1 -1]
#  [-1 -1 -1]]
#要素bから要素dを剰算
print(b * d)
# [[ 0  2  6]
#  [12 20 30]]
#要素bから要素dを除算
print(b / d)
# [[0.         0.5        0.66666667]
#  [0.75       0.8        0.83333333]]

内積

配列同士の内積はdot()メソッドで求めることができます。

#配列同士の内積
b = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

np.dot(b, d)
# array([[ 18,  21,  24],
#        [ 54,  66,  78],
#        [ 90, 111, 132]])

なお、次元が異なる配列同士の内積も計算できます。
次元が異なる配列同士を計算する為には色々条件があるのですが、条件の一つとして配列同士の行の数と列の数が同じ場合と言うのは覚えておくと便利です。

#次元が異なる配列同士の内積
b = np.array([[0, 1, 2], [3, 4, 5]])
d = np.array([[1, 2], [3, 4], [5, 6]])

#2行3列の行列
print(b.shape)
# (2, 3)
#3行2列の行列
print(d.shape)
# (3, 2)

#bの行数とdの列数が一致しているため、計算可能
np.dot(b, d)
# array([[13, 16],
#        [40, 52]])

配列の形状の変換(reshape()メソッドと転置)

reshape()メソッドを用いることで、配列の形状を変換することができます。
また、.Tを用いることで転置をすることができます。転置とは行数と列数を入れ替える操作のことです。

一次元配列から二次元配列への変換

一次元配列を二次元配列に変換する方法のサンプルです。
なお、二次元配列に変換するための要素が足りない場合、もしくは多すぎる場合はエラーとなります。

e = np.array([0, 1, 2, 3, 4, 5, 6, 7])
#二次元配列を生成
f = e.reshape(2, 4)

f
# array([[0, 1, 2, 3],
#        [4, 5, 6, 7]])

要素数が足りない場合はエラー。

e = np.array([0, 1, 2, 3, 4, 5, 6])
f = e.reshape(2, 4)

f
# ---------------------------------------------------------------------------
# ValueError                                Traceback (most recent call last)
# Input In [76], in <cell line: 2>()
#       1 e = np.array([0, 1, 2, 3, 4, 5, 6])
# ----> 2 f = e.reshape(2, 4)
#       4 f

# ValueError: cannot reshape array of size 7 into shape (2,4)

一次元配列から多次元配列への変換

二次元以降の多次元配列もreshape()メソッドを用います。

e = np.array([0, 1, 2, 3, 4, 5, 6, 7])
#三次元配列を生成
f = e.reshape(2, 2, 2)

f
# array([[[0, 1],
#         [2, 3]],

#         [[4, 5],
#          [6, 7]]])

多次元配列から一次元配列への変換

reshape()メソッドの引数に-1を指定することで、どのような形状の配列でも一次元配列に変換することが可能です。

print(f)
# [[0 1 2 3]
#  [4 5 6 7]]

#一次元配列に変換
e = f.reshape(-1)

#一次元配列に変換されていることを確認
print(e)
# [0 1 2 3 4 5 6 7]

転置

転置は変数.Tの書式で実行できます。

e = np.array([0, 1, 2, 3, 4, 5, 6, 7])
f = e.reshape(2, 4)

#2行、4列の行列
print(f)
# [[0 1 2 3]
#  [4 5 6 7]]

#4行、2列の行列に変換
print(f.T)
#  [[0 4]
#   [1 5]
#   [2 6]
#   [3 7]]

要素へのアクセス

要素へのアクセスについては、リストと同じ要領でインデックスを指定することで実現可能です。

一次元配列へのアクセス

一次元配列はリストと同等の指定方法です。

#一次元配列を生成
a = np.array([0, 1, 2, 3, 4, 5])

#参照
print(a[1])
# 1

#代入
a[1] = 9
print(a)
# [0 9 2 3 4 5]

二次元配列、多次元配列へのアクセス

二次元配列、多次元配列へのアクセスもリストと同じ要領です。

#二次元配列を生成
e = np.array([0, 1, 2, 3, 4, 5, 6, 7])
f = e.reshape(2, 4)

print(f)
# [[0 1 2 3]
#  [4 5 6 7]]

#2つ目の配列の2番目の要素にアクセス
print(f[1, 2])

f[1, 2] = 9
print(f)
# [[0 1 2 3]
#  [4 5 9 7]]

集計関数

集計関数を用いることで配列内の要素に対して集計をかけることができます。

#二次元配列を生成
e = np.array([0, 1, 2, 3, 4, 5, 6, 7])
f = e.reshape(2, 4)

#sum()関数で配列内の数字を合計
print(np.sum(f))
# 28
#mean()関数で配列内の数字を平均
print(np.average(f))
# 3.5
#max()関数で配列内の数字の最大値を取得
print(np.max(f))
# 7
#min()関数で配列内の数字の最小値を取得
print(np.min(f))
# 0

また、引数にaxisを指定することで特定の方向で演算を行うことができます。axis=0で縦方向、axis=1で横方向で変算ができます。

#二次元配列を生成
e = np.array([0, 1, 2, 3, 4, 5, 6, 7])
f = e.reshape(2, 4)

print(f)
# [[0 1 2 3]
#  [4 5 6 7]]

print(np.sum(f, axis=0))#縦方向で合計
# [ 4  6  8 10]
print(np.sum(f, axis=1))#横方向で合計
# [ 6 22]
print(np.average(f, axis=0))#縦方向で平均
# [2. 3. 4. 5.]
print(np.average(f, axis=1))#横方向で平均
# [1.5 5.5]
print(np.max(f, axis=0))#縦方向で最大値取得
# [4 5 6 7]
print(np.max(f, axis=1))#横方向で最大値取得
# [3 7]
print(np.min(f,axis=0))#縦方向で最小値取得
# [0 1 2 3]
print(np.min(f,axis=1))#横方向で最小値取得
# [0 4]

numpyの基本的なメソッド

最後に上記で記載した以外のnumpyの基本的なメソッドをまとめてみます。

Noメソッド名概要書式
1arange()一次元配列を生成する#0から引数の数字で指定した数字の一つ前の数字までで配列を生成
np.arange(数字)

#第一引数に指定した数字から第二引数に指定した一つ前の数字までで配列を生成
np.arange(始まりの数字, 終わりの数字)

#第一引数に指定した数字から第二引数に指定した数字の一つ前の数字までで第三引数の間隔で配列を生成
np.arange(始まりの数字, 終わりの数字, 間隔)
2zeros()0のみの配列を生成するnp.zeros((作成したい次元数、及び行数と列数を指定))
例:np.zeros((3, 4))とすると3行4列の0のみの配列を生成
3ones()1のみの配列を生成するnp.ones((作成したい次元数、及び行数と列数を指定))
例:np.ones((3, 4))とすると3行4列の1のみの配列を生成される
4linspace()等間隔で配列を生成するnp.linspace(始まりの数字, 終わりの数字, 間隔)
5append()配列を直列で加えるnp.append(元の配列, 加える配列)
6vstack()配列を行単位で加えるnp.vstack(元の配列, 加える配列1, 加える配列2...)
7hstack()複数の配列を直列で加えるnp.hstack(元の配列, 加える配列1, 加える配列2...)
#No.1:arange()で一次元配列を生成
#0から引数の数字で指定した数字の一つ前の数字までで配列を生成
print(np.arange(10))
# [0 1 2 3 4 5 6 7 8 9]

#第一引数に指定した数字から第二引数に指定した一つ前の数字までで配列を生成
print(np.arange(10, 20))
# [10 11 12 13 14 15 16 17 18 19]

#第一引数に指定した数字から第二引数に指定した数字の一つ前の数字までで第三引数の間隔で配列を生成
print(np.arange(10, 30, 5))
# [10 15 20 25]

#No.2:zeros()で0のみの配列を生成
#二次元配列
print(np.zeros((3, 4)))
# [[0. 0. 0. 0.]
#  [0. 0. 0. 0.]
#  [0. 0. 0. 0.]]

#2行2列の配列を2つ持つ三次元配列
print(np.zeros((2, 2, 2)))
# [[[0. 0.]
#   [0. 0.]]

# [[0. 0.]
#  [0. 0.]]]

#二次元配列を整数型に変換
print(np.zeros((3, 4), dtype=np.int16))
# [[0 0 0 0]
#  [0 0 0 0]
#  [0 0 0 0]]

#No.3:ones()で1のみの配列を生成
#二次元配列
print(np.ones((3, 4)))
# [[1. 1. 1. 1.]
#  [1. 1. 1. 1.]
#  [1. 1. 1. 1.]]

#2行2列の配列を2つ持つ三次元配列
print(np.ones((2, 2, 2)))
# [[[1. 1.]
#   [1. 1.]]

#  [[1. 1.]
#   [1. 1.]]]

#二次元配列を整数型に変換
print(np.ones([3, 4], dtype=np.int16))
# [[1 1 1 1]
#  [1 1 1 1]
#  [1 1 1 1]]

#No.4:linspace()で等間隔で配列を生成
print(np.linspace(0, 2, 9))
# [0.   0.25 0.5  0.75 1.   1.25 1.5  1.75 2.  ]

#no.5:append()で配列を直列で加える
x = np.arange(0, 10, 2)
y = np.arange(5)
z = np.arange(0, 100, 20)

print(np.append(x, y))
# [0 2 4 6 8 0 1 2 3 4]

#No.6:vstack()で配列を行単位で加える
print(np.vstack([x, y, z]))
# [0 2 4 6 8 0 1 2 3 4]
# [[ 0  2  4  6  8]
#  [ 0  1  2  3  4]
#  [ 0 20 40 60 80]]

#No.7:vstack()で複数の配列を直列で加える
print(np.vstack([x, y, z]))
# [ 0  2  4  6  8  0  1  2  3  4  0 20 40 60 80]

参考資料

この記事はUdemyの以下4つの講座を参考に作成しました。

現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル
【データサイエンス×ビジネスコミュニケーション】現役データサイエンティストが教える「伝えて動かすデータ分析」
【キカガク流】人工知能・機械学習 脱ブラックボックス講座 – 初級編 –及び【キカガク流】人工知能・機械学習 脱ブラックボックス講座 – 中級編 –
自然言語処理とチャットボット: AIによる文章生成と会話エンジン開発

現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル

画像に alt 属性が指定されていません。ファイル名: a1ee3d048d6aa860662b6f58c4aa167f-1024x328.png
Udemyより抜粋

当講座はPythonの基礎から応用まで幅広く学べる講座なのでおすすめです。
この講座の講師はとにかくPythonについての知識が豊富ですし、話も適度な速さで聞き取りやすいです。さすがのシリコンバレーです。
また、最後の方に機械学習で使うライブラリについても解説があるので、データサイエンス・AIについても多少知ることができます。

当講座のおすすめポイントを以下にまとめておきます。

当講座のおすすめポイント

シリコンバレーで働いているということもあり、講師のPythonの知識が豊富

話も適度な速さで聞き取りやすい

コードの意味だけでなく、それをどう応用するかまで解説してくれる

【データサイエンス×ビジネスコミュニケーション】現役データサイエンティストが教える「伝えて動かすデータ分析」

Udemyより抜粋

当講座のおすすめポイントを以下にまとめておきます。

当講座のおすすめポイント

Pythonを知らなくても講座の中で学ぶことが可能なので初学者でもOK

データサイエンスの手法だけでなく、それをどのようにビジネスに活かすかまで学べる

この講座の最大の特徴は、データサイエンスを実務でどのように活かすかまで言及されている点です。
他の講座だとデー分析の手法や機械学習の実装方法だけ伝えるものもあるのですが、この講座はデータサイエンスの習得を目的とせず、その先を見据えた講義になっているので、実務での使用イメージが湧きやすいです。

【キカガク流】人工知能・機械学習 脱ブラックボックス講座 – 初級編 –

【キカガク流】人工知能・機械学習 脱ブラックボックス講座 – 中級編 –

Udemyより抜粋
Udemyより抜粋

株式会社キカガクが作成している【キカガク流】人工知能・機械学習 脱ブラックボックス講座 – 初級編 –及び【キカガク流】人工知能・機械学習 脱ブラックボックス講座 – 中級編 –のシリーズもわかりやすいです。こちらも購入済みです。

当講座のおすすめポイント

初球では単回帰を中級では重回帰の原理を数式を用いて丁寧に解説

Pythonを知らなくても講座の中で学ぶことが可能なので初学者でもOK

それぞれの講座の時間が短いので手軽に学べる

脱ブラックボックスと銘打っているだけあって、機械学習の基礎である、回帰の原理を数式を使いながらステップバイステップで丁寧に説明してくれます。もちろん、解説だけでなくて講義の中で実装もします。
上級はまだ出ていないようなのですが、出たとしたらすぐでも買いたいと思えるシリーズです。

自然言語処理とチャットボット: AIによる文章生成と会話エンジン開発

Udemyより抜粋

当講座は講座名の通り、技術の発展がめざましいAIによる文章生成と会話エンジン開発を体験できる講座です。

当講座のおすすめポイント

Pythonを知らなくても講座の中で学ぶことが可能なので初学者でもOK

説明に使用しているマテリアルが綺麗

ホットな自然言語処理を短時間で学べる

この講座の講師である我妻さんは他にもデータサイエンスに関連するたくさんの講座を出しており、いずれの講座もレビュー評価が高いです。話し方が少しマテリアルを棒読みになってしまっている点が惜しいところですが、内容自体は綺麗にまとまっています。内容的に自然言語処理だけでなく、Pythonの基礎と数学の基礎にも触れられているので、データサイエンスそのものに興味がある方にもおすすめです。

なお、Udemyについては以下の記事でまとめていますのでご参考ください。

まとめ

ということで、今回はデータ分析でよく用いられるライブラリであるnumpyについて解説しました。
この記事では基本しか紹介できていませんが、データ分析の現場ではほぼ必須となるライブラリなので、使いながら使い方を覚えていきましょう!
では、今回はここまでとさせていただきます。