Pythonでデータ分析をする際によく使用されるNumPyで配列(ndarray)を作成する方法を解説します。Python組み込み型のlistからarray関数を使用して作成する方法とNumPyの各種関数(zeros, ones, full, arange, random, randint, randn, normal, linspace, eye, empty)を使用して作成する方法をご紹介します。
Contents
Python組み込み型のlistから作成する方法
一般的な作成方法(array関数)
NumPyで配列(ndarray)を作成する一番簡単な方法はPython組み込み型のlistからarray関数を用いて作成する方法です。
listから作成するには以下の例のようにします。
import numpy as np data = [1, 2, 3, 4, 5] data_array = np.array(data) print(data_array) print(type(data_array))
【実行結果】 [1 2 3 4 5] <class 'numpy.ndarray'>
上記のようにlistをarray関数に渡すことで、NumPyのndarrayを作成することができます。typeで確認をしていますが、numpy.ndarrayというNumPyの型になっていることが分かります。
array関数のドキュメントはこちらを参照してください。
型が異なる場合は(可能であれば)アップキャストする
NumPyのndarrayは、Python組み込み型のlistのように任意の型の値を持たせることはできません。これが、Python組み込み型よりも処理が速い理由の一つでもあります。
以下の例のようにfloatとintが混ざったlistを入力した場合は、NumPyは可能であればアップキャストし、float型にしてndarrayを作成します。
import numpy as np data = [1.23, 2, 3, 4, 5] data_array = np.array(data) print(data_array) print(type(data_array)) print(data_array.dtype)
【実行結果】 [1.23 2. 3. 4. 5. ] <class 'numpy.ndarray'> float64
実行結果を確認してみると入力時ではintであった「2」は「2. 」のようになっており、型も見てみてもfloat64になっていることが分かります。
型を明示的に指定したい場合
作成する型を明示的に指定したい場合は、dtype引数に型を設定することで指定した型でndarrayを作成することができます。
import numpy as np data = [1, 2, 3, 4, 5] data_array = np.array(data, dtype=np.double) print(data_array) print(type(data_array)) print(data_array.dtype)
【実行結果】 [1. 2. 3. 4. 5.] <class 'numpy.ndarray'> float64
この例では、float64になるnp.doubleを指定して作成している例ですが、他の型ももちろん指定できます。また、ndarrayは上記のdata_array.dtypeのように属性として型を簡単に確認することができます。
指定できるデータタイプについては、こちらのドキュメントを参照してください。
多次元配列を作成する場合
多次元配列を作成したい場合は、リストのリストという形となっているlistをarray関数の入力にすることで簡単に作成できます。
import numpy as np data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] data_array = np.array(data) print(data_array) print(type(data_array)) print(data_array.shape) print(data_array.dtype)
【実行結果】 [[1 2 3] [4 5 6] [7 8 9]] <class 'numpy.ndarray'> (3, 3) int32
上記の例では、3×3の配列を作成しています。
ndarrayの形を確認したい場合は、shapeを使うことで確認ができます。上記では(3, 3)のように結果が返ってきていることが分かります。
NumPyの関数を使用して作成する方法
listから配列(ndarray)を作成する方法を見てきましたが、NumPyが持っている各種関数を使ってndarrayを作成することが可能です。
0埋めの配列を作成する場合(zeros関数)
0埋めの配列を作成する場合には、zeros関数を使用します。使用例は以下の通りです。
import numpy as np data_array = np.zeros(10) print(data_array) print(type(data_array)) print(data_array.dtype)
【実行結果】 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] <class 'numpy.ndarray'> float64
zeros関数のドキュメントはこちらを参照してください。
1埋めの配列を作成する場合(ones関数)
1埋めの配列を作成する場合には、ones関数を使用します。使用例は以下の通りです。
import numpy as np data_array = np.ones(10) print(data_array) print(type(data_array)) print(data_array.dtype)
【実行結果】 [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.] <class 'numpy.ndarray'> float64
ones関数のドキュメントはこちらを参照してください。
指定した値で埋めた配列を作成する場合(full関数)
指定した値で埋めた配列を作成する場合には、full関数を使用します。 使用例は以下の通りです。
import numpy as np data_array = np.full((3, 3), 1.5) print(data_array) print(type(data_array)) print(data_array.dtype)
[[1.5 1.5 1.5] [1.5 1.5 1.5] [1.5 1.5 1.5]] <class 'numpy.ndarray'> float64
full関数のドキュメントはこちらを参照してください。
指定間隔の連続値で配列を作成する場合(arange関数)
Pythonの組み込み関数でrangeをよく使うかと思います。同様にNumPyでもarange関数が用意されています。arangeであることに注意してください。
使用方法は以下の通りで、開始、終了、ステップを指定するにはrange関数と同じです。
import numpy as np data_array = np.arange(0, 10, 2) print(data_array) print(type(data_array)) print(data_array.dtype)
【実行結果】 [0 2 4 6 8] <class 'numpy.ndarray'> int32
arange関数のドキュメントはこちらを参照してください。
ランダムな数値で配列を作成する場合
色々な分析の初期値など、ランダムな数値を用意するケースはよく発生します。NumPyでのランダムな値の生成についていくつかの関数を見ていきます。
0~1のランダムな配列を作成する場合 (random関数)
0~1のランダムな配列を作成したい場合は、random関数を使用します。使用例は以下の通りです。
import numpy as np data_array = np.random.random((3, 3)) print(data_array) print(type(data_array)) print(data_array.dtype)
【実行結果】 [[0.30068121 0.34934379 0.25923243] [0.06904324 0.02935395 0.56785741] [0.72615491 0.75143937 0.3390085 ]] <class 'numpy.ndarray'> float64
random関数のドキュメントはこちらを参照してください。
int型のランダムな数値の配列を作成する場合(randint関数)
int型のランダムな数値配列を作成する場合には、randint関数を使用します。
import numpy as np data_array = np.random.randint(0, 20, (3, 3)) print(data_array) print(type(data_array)) print(data_array.dtype)
【実行結果】 [[10 16 15] [10 14 16] [12 0 8]] <class 'numpy.ndarray'> int32
randint関数では、上記の例のように最小値、最大値と配列の形状を指定します。
randint関数のドキュメントはこちらを参照してください。
標準正規分布に従う数値の配列を作成する場合(randn関数)
標準正規分布(平均0, 標準偏差1)の正規分布に従うデータ配列を作成したい場合は、randn関数を使用します。使用例は以下の通りです。
import numpy as np data_array = np.random.randn(10) print(data_array) print(type(data_array)) print(data_array.dtype)
【実行結果】 [ 0.06963259 -1.65648444 0.65346528 -0.80301814 0.37937227 -0.34091399 0.90080966 1.63180066 1.02879147 0.60091374] <class 'numpy.ndarray'> float64
randn関数のドキュメントはこちらを参照してください。
任意の正規分布に従う数値の配列を作成する場合(normal関数)
任意の正規分布に従うランダムなデータ配列を作成したい場合は、normal関数を使用します。使用例は以下の通りです。
import numpy as np data_array = np.random.normal(1, 5, (3, 3)) print(data_array) print(type(data_array)) print(data_array.dtype)
【実行結果】 [[-1.62300862 -6.10085984 2.3361214 ] [ 0.01017804 9.93436437 1.56993599] [ 5.3599857 7.59139232 0.05871388]] <class 'numpy.ndarray'> float64
上記の例のように、平均、標準偏差、配列の形状を渡すことでデータを生成します。
normal関数のドキュメントはこちらを参照してください。
等間隔のデータを作成する場合(linspace関数)
グラフの描画の際のx軸など、色々なケースで等間隔なデータを作成したくなる場合があります。等間隔のデータを作成する場合は、linspace関数を使用します。
import numpy as np data_array = np.linspace(0, 1, 5) print(data_array) print(type(data_array)) print(data_array.dtype)
【実行結果】 [0. 0.25 0.5 0.75 1. ] <class 'numpy.ndarray'> float64
上記の例のように値の最小値、最大値、データ点数を指定することで等間隔なデータを作成します。
linspace関数のドキュメントはこちらを参照してください。
単位行列を作成する場合(eye関数)
単位行列(対角に1が並ぶ配列)を作成する場合には、eye関数を使用します。使用例は以下の通りです。
import numpy as np data_array = np.eye(3) print(data_array) print(type(data_array)) print(data_array.dtype)
【実行結果】 [[1. 0. 0.] [0. 1. 0.] [0. 0. 1.]] <class 'numpy.ndarray'> float64
eye関数のドキュメントはこちらを参照してください。
値が初期化されてはいない配列を作成する場合(empty関数)
numpyには、empty関数というものが用意されています。この関数の特徴は、値が初期化されていないというところです。初期化がされない分、zerosやonesよりも高速になります。
import numpy as np data_array = np.empty(10) print(data_array) print(type(data_array)) print(data_array.dtype)
【実行結果】 [ 0.06963259 -1.65648444 0.65346528 -0.80301814 0.37937227 -0.34091399 0.90080966 1.63180066 1.02879147 0.60091374] <class 'numpy.ndarray'> float64
実行した際のメモリの配置などにより実行結果が変わります。初期化は必要ないのため値はともかく配列を用意したい場合に使用します。また、他のプログラマーに初期化する必要がないことを伝えるという意味で使うこともできます。
empty関数のドキュメントはこちらを参照してください。
上記で紹介しているソースコードについてはgithubにて公開しています。参考にしていただければと思います。