1. Home
  2. プログラマーのための線形代数
  3. NumPyの使い方
  4. ベクトルと行列の作成

ベクトルと行列の作成

NumPy は、データ・サイエンティストや機械学習のプログラマーにとって、なくてはならない Python の数値計算ライブラリです。

その一番の理由は、Python のリストなどとは異なり、NumPy ではデータを線形代数において基本的な形であるベクトルや行列として扱うことができるからです。そしてベクトルや行列で表したデータを効率よく扱うためのさまざまなツールが実装されています。

そこでこのページではまず NumPyの初心者のために、最も基本的であり必ず覚えておくべき以下の操作を簡潔に解説します。

当ページで学ぶこと

  • ベクトルの作成方法
  • 行列の作成方法
  • データ属性の確認
  • ベクトル・行列作成によく使われる 3 つの関数

なお「データ属性」とは行列の行数や列数、要素の型といったデータに関する基本情報のことです。これらはデータを扱う前に必ず確認することになるものなので抑えておきましょう。

それでは、それぞれ見ていきましょう。

NumPy 配列でベクトルと行列を作成

NumPyでベクトルや行列を作成するためのもっとも基本的な方法は np.array 関数を使うことです。この関数に 1 次元リストを渡すとベクトルを 2 次元リストを渡すと行列を作成します。それぞれ確認してみましょう。

なお NumPy で作成するベクトルや配列は、ndarray という名前のオブジェクトになります。実務上はこれらは単に「配列」と言います。

ベクトルを作成

np.array 関数に一次元リストを渡せばベクトルを作成することができます。

In [1]:
# NumPyをインポート
import numpy as np

# ベクトルを作成
x = np.array([1,2])
print(x)
[1 2]

行列を作成

np.array 関数に二次元リストを渡せば行列を作成することができます。

In [2]:
# 行列を作成
A = np.array(
    [[1,2],
     [3,4]]
)
print(A)
[[1 2]
 [3 4]]

以上がベクトルと行列の作成です。

NumPy では、こうやって作成したベクトルや行列を使って、四則演算からドット積の計算、LU 分解や固有値分解、特異値分解など、線形代数のほとんどすべての演算を効率的に行うことができます。例えばベクトルと行列の積は、以下のコードのようにそれぞれを @ 演算子で繋ぐことで求めることができます。

In [3]:
# ベクトルと行列の積を計算
y = A @ x
print(y)
[ 5 11]

NumPy 配列のデータ属性の確認

NumPy の配列データには「属性」という様々な基本情報があります。その中でよく使うのは次の 2 つです。

  • shape 属性:データの行数や列数
  • dtype 属性:データの要素の型

これらの属性は、ndarray.shapendarray.dtype というように、配列の後にドットをつけて属性をつなげることで確認することができます。具体的に見ていきましょう。

shape 属性

まず shape 属性はベクトルや行列の行数や列数を格納しています。主にベクトルや行列を操作する前に、データサイズを確認するために使います。

In [4]:
# 2行3列の行列を作成
B = np.array(
    [[1,2,3],
     [4,5,6]]
)
# 行列の形状(行数・列数)を確認
s = B.shape
print(s)
(2, 3)

dtype 属性

次に dtype 属性はベクトルや行列の要素の型を格納しています。これもベクトルや行列を操作する前に、その要素がどのようなデータなのかを確認するために使います。

In [5]:
# 要素が浮動小数点数の行列を作成
C = np.array(
    [[1.0,2.0],
     [3.0,4.0]]
)
# 行列のデータ型を確認
d = C.dtype
print(d)
float64

以上が数値計算ライブラリの NumPy でベクトルや行列データを作成するための方法です。

ベクトル・行列作成によく使われる 3 つの関数

ここまでNumPy でベクトルや行列といった基本的なデータを作成する方法を解説しました。NumPyには、他にも行列を効率よく作成するための便利な関数が複数用意されています。ここでは、その中でも実務上特に使う機会が多い代表的なものを 3 つ紹介します。

具体的には以下の通りです。

行列作成でよく使う 3 つの関数

  • ep.empty:要素が未初期化の任意の形状の配列を作成
  • np.zeros:要素が 0 の任意の形状の配列を作成
  • np.ones:要素が 1 の任意の形状の配列を作成

これらの関数に作成したい行列のサイズをタプルやリストで [行数、列数] と渡すと、任意の行数列数の行列を簡単に作成することができます。

それぞれ一つずつ見ていきましょう。

np.empty関数

np.empty関数は、データは後で入力することを想定した、指定の行数と列数の未初期化の行列を作成するための関数です。データは、この行列を使用する前に代入することを前提としているため、この関数で行列を作成した段階では、要素の値はランダムになります。

以下のコードがこの関数の使用例です。引数には行列の形状(行数と列数)をリストやタプルで渡します。

In [1]:
# NumPyのインポート
import numpy as np
# 空の3行3列の行列の作成
A = np.empty([3, 3])
print(A)
[[ 6.17779239e-31 -1.23555848e-30  3.08889620e-31]
 [-1.23555848e-30  2.68733969e-30 -8.34001973e-31]
 [ 3.08889620e-31 -8.34001973e-31  4.78778910e-31]]

np.zeros関数

np.zeros関数は、任意の形状(行数列数)で、要素の全ての値が 0 の行列を作成するための関数です。引数には任意の形状のリストを渡します。以下のコードでは3行5列の行列を作成しています。

In [2]:
# NumPyのインポート
import numpy as np
# 3行5列で要素が0の行列の作成
B = np.zeros([3, 5])
print(B)
[[0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]]

np.ones関数

np.ones関数は、任意の形状(行数列数)で、要素の全ての値が 1 の行列を作成するための関数です。引数には任意の形状のリストを渡します。以下のコードでは5行3列の行列を作成しています。

In [3]:
# NumPyのインポート
import numpy as np
# 5行3列で要素が1の行列の作成
C = np.ones([5, 3])
print(C)
[[1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]]

以上 3 つの行列作成関数は実務上、目にする機会がとても多いので、ぜひ覚えておきましょう。


一緒に読んでおきたいページ