Numpyの基本:生成関数

スポンサーリンク
Python基礎
スポンサーリンク

Numpyは様々な科学計算で必要な操作が様々パッケージされたPythonのライブラリです。今回はNumpyの基礎であるndarrayの「生成関数」についてまとめみました。本当に数多くの生成関数があります。ndarrayの箱を作る部分が充実しているのもnumpyの魅力です。

Numpy公式ドキュメント(英語)

Numpyのインポート

Numpyがインストールされていない場合は、pipコマンドなどでインストールを行っておきます。Numpyを使用するために、最初に下記のようにインポートします。

import numpy as np

Numpyのndarrayオブジェクト

Numpyは特徴的なndarrayオブジェクトを使います。

ndarrayの特徴

  • 多次元の要素を扱い、作成時に固定したサイズを設定する
  • 要素はすべて同じデータ型である
  • 数学的な操作や関数の適用などを容易に行うことができる
  • 各要素にはインデックスでアクセスできる

例えば、下のように1次元のリストAとリストBのそれぞれの要素の足し算や掛け算を行う時、Pythonのリスト型ならそれぞれの値を呼び出して、計算する必要がありますが、Numpyを使えば、非常にシンプルで分かりやすく直感的に数式を記述できます。下に例を記述しますが、特にnumpyの場合は大量のデータを同時に処理する用途には非常に向いています。

# Pythonのリスト型の場合
a = [3, 5, 7, 9]
b = [10, 15, 20, 100]

c = [0]*4
d = [0]*4
for i in range(4):
    c[i] = a[i] + b[i]
    d[i] = a[i] * b[i]

print('c = {}'.format(c)) # c = [13, 20, 27, 109]
print('d = {}'.format(d)) # d = [30, 75, 140, 900]

# Numpyの場合
a = np.array([3, 5, 7, 9])
b = np.array([10, 15, 20, 100])

c = a + b
d = a * b

print('c = {}'.format(c)) # c = [13, 20, 27, 109]
print('d = {}'.format(d)) # d = [30, 75, 140, 900]

Numpyのいろいろなパターンのndarrayを作る

Numpyの魅力の一つにndarrayを作るための多くの生成関数を持っていることがあります。下にその一部を表にしました。うまく使いこなして、データ処理の良いスタートダッシュを切りたいものです。今回、これらの生成関数を1つずつ使って解説していこうと思います。

Numpy関数生成するndarray
numpy.emptyエントリを初期化せずに、与えられた形状と型の新しい配列を返す。
numpy.empty_like指定された配列と同じ形状、同じ型の新しい配列を返す。
numpy.eye対角線上に1、それ以外に0を持つ2次元配列を返す。
numpy.identity主対角線上に1を持つ正方形の恒等式配列を返す。
numpy.ones指定された形と型の、1で満たされた新しい配列を返します。
numpy.ones_like与えられた配列と同じ形と型を持つ1で満たされた配列を返します。
numpy.zeros指定された形と型の、0で満たされた新しい配列を返します。
numpy.zeros_like与えられた配列と同じ形と型を持つ0で満たされた配列を返します。
numpy.full指定された形と型の、指定された値で満たされた新しい配列を返します。
numpy.full_like与えられた配列と同じ形と型を持つ指定された値で満たされた配列を返します。
numpy.arange与えられた区間内の等間隔な値の配列を返す。
numpy.linspace指定された区間において、等間隔に配置された数値を返します。
numpy.logspace対数スケールで等間隔に並んだ数字の配列を返す。
numpy.geomspace指定された区間において、一定の倍数で並んだ数字の配列を返す。
numpy.meshgrid座標ベクトルから座標行列を返す。
numpy.mgrid与えられた区間の肉付けされたメッシュグリッドの配列を返す。
numpy.ogrid与えられた区間の肉付けされていないメッシュグリッドの配列を返す。

numpy.empty

numpy.empty(形, dtype=データ型)
形・・・一次元:2などの数字、多次元:(3,4)などのタプル
dtype・・・デフォルトはfloat(オプション)
a = np.empty((2,3))
print(a)
[[2.12199579e-314 6.36598737e-314 1.06099790e-313]
 [1.48539705e-313 1.90979621e-313 2.33419537e-313]]
b = np.empty(4, dtype=int)
print(b)
[ 1725592507 -1975066123  -441623786   545863749]

np.emptyで作られるndarrayの初期値はメモリ上の適当な位置のデータが使われます。ですので、意味を持たすためには、何らかの値を入れてやらないといけません。初期化しない分、動作がちょこっとだけ早いそうです。

numpy.empty_like

numpy.empty_like(原型のndarray, dtype=データ型)
dtype:オプション

np.emptyと似ていますが、原型のndarrayと同じ大きさのndarrayを作ってくれます。dtypeを省略すると原型のデータと同じ型になります。指定すると、データ型を上書きできます。

a = np.array([[1, 3],[4,3]])
b = np.empty_like(a)
print(b)
[[7 4]
 [5 3]]

空いたメモリの部分も使っているので、どこかで見たような値になることもあります

numpy.eye

numpy.eye(出力する行数, M=出力する列数, k=対角線の位置, dtype=データ型)
M:デフォルトは行数同じ(オプション)
k:デフォルトは0で主対角線、正の値は上側の対角線、負の値は下側の対角線に1を配置(オプション)
dtype:デフォルトはfloat型(オプション)

対角線に1で、それ以外が0になった行列を生成します。

a = np.eye(4)
print(a)
[[1. 0. 0. 0.]
 [0. 1. 0. 0.]
 [0. 0. 1. 0.]
 [0. 0. 0. 1.]]

numpy.identity

numpy.identity(行と列の数, dtype=データ型)
dtype:デフォルトはfloat型(オプション)

対角が1でそれ以外は0の行数と列数が同じいわゆる単位行列Eを生成します。

a = np.identity(2)
print(a)
[[1. 0.]
 [0. 1.]]

numpy.ones

numpy.ones(形, dtype=データ型)
形・・・一次元:2などの数字、多次元:(3,4)などのタプル
dtype・・・デフォルトはfloat(オプション)
a = np.ones((3,4), dtype=int)
print(a)
[[1 1 1 1]
 [1 1 1 1]
 [1 1 1 1]]

指定された大きさの1で満たされたndarrayを生成します。

numpy.ones_like

numpy.ones_like(原型のndarray)
a = np.array([[1, 2, 3],[4, 3 ,2]])
b = np.ones_like(a)
print(b)
[[1 1 1]
 [1 1 1]]

np.onesと似ていますが、原型のndarrayと同じ大きさの1で満たされたndarrayを作ってくれます。

numpy.zeros

numpy..zeros(形, dtype=データ型)
形・・・一次元:2などの数字、多次元:(3,4)などのタプル
dtype・・・デフォルトはfloat(オプション)
a = np.zeros((3,4), dtype=int)
print(a)
[[0 0 0 0]
 [0 0 0 0]
 [0 0 0 0]]

指定された大きさの0で満たされたndarrayを生成します。

numpy.zeros_like

numpy.zeros_like(原型のndarray)
a = np.array([[1, 2, 3],[4, 3 ,2]])
b = np.zeros_like(a)
print(b)
[[0 0 0]
 [0 0 0]]

np.zerosと似ていますが、原型のndarrayと同じ大きさの0で満たされたndarrayを作ってくれます。

numpy.full

numpy.full(形, 満たす値, dtype=データ型)
形・・・一次元:2などの数字、多次元:(3,4)などのタプル
dtype・・・デフォルトは満たす値と同じ(オプション)
a = np.full((3,4), 'on')
print(a)
[['on' 'on' 'on' 'on']
 ['on' 'on' 'on' 'on']
 ['on' 'on' 'on' 'on']]

指定した形で、指定した値で満たされたndarrayを生成します。

numpy.full_like

numpy.full_like(原型のndarray, 満たす値)
a = np.array([[1, 2, 3],[4, 3 ,2]])
b = np.full_like(a, 100)
print(b)
[[100 100 100]
 [100 100 100]]

原型と同じ形で、指定した値で満たされたndarrayを生成します。

numpy.arange

numpy.arange([区間の開始点, ]区間の終点, [ステップ, ])
区間の終点は終点そのものは含みません。(終点に達する手前で終わる)
開始点・・・入力しないと0からになります(オプション)
ステップ・・・入力しないと1になります(オプション)
a = np.arange(10)
print(a)
[0 1 2 3 4 5 6 7 8 9]

与えられた区間での等間隔の値を生成します。

numpy.linspace

numpy.linspace(開始点, 終点, num=値の数, endpoint=True/False, retstep=True/False, dtype=データ型)
num:デフォルトは50(オプション)
endpoint: 終点を含めるかどうか。デフォルトはTrueで含める(オプション)
retstep:Trueにすると、(ndarray, 数値の間隔)を生成する。デフォルトはFalse(オプション)
dtype:データ型を指定する。デフォルトはfloat型になる(オプション)
a = np.linspace(0,2,21)
print(a)
[0.  0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.  1.1 1.2 1.3 1.4 1.5 1.6 1.7
 1.8 1.9 2. ]

linspaceは開始点と終点で指定された区間を対数で指定された数の等間隔の数値を生成します。linespaceではないので注意!
数式をmatplotlibでグラフ化するときに連続するXを取得するときにとっても便利です。

numpy.logspace

numpy.logspace(開始点, 終点, num=値の数, base= 対数の底, endpoint=True/False, dtype=データ型)
num:デフォルトは50(オプション)
endpoint: 終点を含めるかどうか。デフォルトはTrueで含める(オプション)
base:対数の底。デフォルトは10.0(オプション)
dtype:データ型を指定する。デフォルトはfloat型になる(オプション)
a = np.logspace(0, 5, 11, dtype=int)
print(a)
[     1      3     10     31    100    316   1000   3162  10000  31622
 100000]

対数スケールで指定した開始点と終点で指定された区間で指定された数の対数で等間隔の数値を生成します。

numpy.geomspace

numpy.geomspace(開始点, 終点, num=値の数, endpoint=True/False, dtype=データ型)
num:デフォルトは50(オプション)
endpoint: 終点を含めるかどうか。デフォルトはTrueで含める(オプション)
dtype:データ型を指定する。デフォルトはfloat型になる(オプション)
a = np.geomspace(1,256,9)
print(a)
[  1.   2.   4.   8.  16.  32.  64. 128. 256.]

対数スケールで指定した開始点と終点で指定された区間で指定された数の対数で等間隔の数値を生成します。logspaceと違いは、区間で値そのものを指定する点です。生成する数列は等比数列になっています。

numpy.meshgrid

numpy.meshgrid(配列, indexing=座標系)
indexing:'xy'か'ij'を指定する。デフォルトは'xy'(オプション)
a = np.linspace(0,5,6, dtype=int)
xv, yv = np.meshgrid(a, a)
print(xv)
print()
print(yv)
[[0 1 2 3 4 5]
 [0 1 2 3 4 5]
 [0 1 2 3 4 5]
 [0 1 2 3 4 5]
 [0 1 2 3 4 5]
 [0 1 2 3 4 5]]

[[0 0 0 0 0 0]
 [1 1 1 1 1 1]
 [2 2 2 2 2 2]
 [3 3 3 3 3 3]
 [4 4 4 4 4 4]
 [5 5 5 5 5 5]]

座標ベクトルから座標行列を生成します。3D空間のプロットなどのためのメッシュ状のマス目を作ってくれます。

numpy.mgrid

多次元のmeshgridを生成する「インスタンス」
例えば、2次元のmeshgridを生成するには、
numpy.mgrid[第1軸の開始点:終点:ステップ間隔, 第2軸の開始点:終点:ステップ間隔]
ただし、終点は含まない。(ただし、ステップを複素数にすると終点を含む!)
xy_plane = np.mgrid[0:2:0.5, 0:2:0.5]
print(np.shape(xy_plane))
print(type(xy_plane))
print(xy_plane)
(2, 4, 4)
<class 'numpy.ndarray'>
[[[0.  0.  0.  0. ]
  [0.5 0.5 0.5 0.5]
  [1.  1.  1.  1. ]
  [1.5 1.5 1.5 1.5]]

 [[0.  0.5 1.  1.5]
  [0.  0.5 1.  1.5]
  [0.  0.5 1.  1.5]
  [0.  0.5 1.  1.5]]]

numpy.ogrid

肉付けされていないインデックスのmeshgrid(オープンなメッシュグリッド)を生成する「インスタンス」
例えば、2次元のmeshgridのインデックスは、
numpy.ogrid[第1軸の開始点:終点:ステップ間隔, 第2軸の開始点:終点:ステップ間隔]
ただし、終点は含まない。(ただし、ステップを複素数にすると終点を含む!)
xy_axes = np.ogrid[0:3:0.5,0:3:0.5]
print(np.shape(xy_axes))
print(type(xy_axes))
print(xy_axes[0])
print(xy_axes[1])
(2,)
<class 'list'>
[[0. ]
 [0.5]
 [1. ]
 [1.5]
 [2. ]
 [2.5]]
[[0.  0.5 1.  1.5 2.  2.5]]

コメント