NumPyのarange, linspaceの使い方(連番や等差数列を生成)

NumPyで連番や等差数列(等間隔の配列ndarray)を生成するにはnumpy.arange()かnumpy.linspace()を使います。arange()は間隔(公差)を指定、linspace()は要素数を指定という違いがあるので、目的によって使い分ける。

numpy.arange — NumPy v1.15 Manual numpy.linspace — NumPy v1.15 Manual

ここでは以下の内容について説明します。

間隔(公差)を指定するnumpy.arange()の使い方 要素数を指定するnumpy.linspace()の使い方 基本的な使い方 stopを含むか指定: 引数endpoint 間隔を取得: 引数retstep

逆順に変換 多次元配列に変換

間隔(公差)を指定するnumpy.arange()の使い方

numpy.arange()はPython組み込みのrange()のndarray版。range()については以下の記事を参照。

引数の考え方はrange()と同様。引数の個数によって以下のように等差数列を配列ndarrayとして生成します。

numpy.arange(stop) 0 ≦ n < stopで間隔は1

numpy.arange(start, stop) start ≦ n < stopで間隔は1

numpy.arange(start, stop, step) start ≦ n < stopで間隔はstep

import numpy as np

print(np.arange(3))
# [0 1 2]

print(np.arange(3, 10))
# [3 4 5 6 7 8 9]

print(np.arange(3, 10, 2))
# [3 5 7 9]

range()と異なり、浮動小数点数floatを引数に指定可能。

print(np.arange(0.3, 1.0, 0.2))
# [0.3 0.5 0.7 0.9]

負の値を指定したときの振る舞いなどもrange()と同じ。該当する値がないときは空のndarrayとなるのも同様。

print(np.arange(-3, 3))
# [-3 -2 -1  0  1  2]

print(np.arange(10, 3))
# []

print(np.arange(10, 3, -2))
# [10  8  6  4]

データ型dtypeは自動的に選択されるが、引数dtypeで指定することもできます。

print(np.arange(3, dtype=float))
# [0. 1. 2.]

print(np.arange(3, 10, dtype=float))
# [3. 4. 5. 6. 7. 8. 9.]

print(np.arange(3, 10, 2, dtype=float))
# [3. 5. 7. 9.]

NumPyのデータ型dtypeについての詳細は以下の記事を参照。

要素数を指定するnumpy.linspace()の使い方

基本的な使い方

numpy.linspace()も等差数列を生成するが、間隔(公差)ではなく要素数を指定します。 第一引数startに最初の値、第二引数stopに最後の値、第三引数numに要素数を指定します。それらに応じた間隔(公差)が自動的に算出される。

import numpy as np

print(np.linspace(0, 10, 3))
# [ 0.  5. 10.]

print(np.linspace(0, 10, 4))
# [ 0.          3.33333333  6.66666667 10.        ]

print(np.linspace(0, 10, 5))
# [ 0.   2.5  5.   7.5 10. ]

start > stopの場合も適切に処理してくれる。

print(np.linspace(10, 0, 5))
# [10.   7.5  5.   2.5  0. ]

データ型dtypeは自動的に選択されるが、引数dtypeで指定することもできます。

print(np.linspace(0, 10, 3, dtype=int))
# [ 0  5 10]

stopを含むか指定: 引数endpoint

これまでの例のように、デフォルトでは第二引数stopの値も結果に含まれる。 引数endpointをFalseとすると、結果にstopが含まれない。

print(np.linspace(0, 10, 5))
# [ 0.   2.5  5.   7.5 10. ]

print(np.linspace(0, 10, 5, endpoint=False))
# [0. 2. 4. 6. 8.]

引数endpointと間隔(公差)stepの関係は以下のようになる。

endpoint=True(デフォルト)

step = (stop - start) / (num - 1)

endpoint=False

step = (stop - start) / num

間隔を取得: 引数retstep

間隔(公差)stepを取得したい場合は引数retstepをTrueとします。 (結果のndarray, step)という要素数2のタプルが返される。

result = np.linspace(0, 10, 5, retstep=True)

print(result)
# (array([ 0. ,  2.5,  5. ,  7.5, 10. ]), 2.5)

print(type(result))
# <class 'tuple'>

print(result[0])
# [ 0.   2.5  5.   7.5 10. ]

print(result[1])
# 2.5

stepだけ確認したい場合はインデックスで2つ目の要素を指定すれば問題ありません。

print(np.linspace(0, 10, 5, retstep=True)[1])
# 2.5

print(np.linspace(0, 10, 5, retstep=True, endpoint=False)[1])
# 2.0

逆順に変換

numpy.arange()では引数を適切に指定すれば逆順の配列を取得できるが面倒。

print(np.arange(3, 10, 2))
# [3 5 7 9]

print(np.arange(9, 2, -2))
# [9 7 5 3]

スライス[::-1]か、numpy.flip()を使うと楽。

numpy.flip — NumPy v1.15 Manual

print(np.arange(3, 10, 2)[::-1])
# [9 7 5 3]

print(np.flip(np.arange(3, 10, 2)))
# [9 7 5 3]

numpy.linspace()の場合は、上の例のように第一引数startと第二引数stopを入れ替えれば簡単に逆順にできます。スライス[::-1]、numpy.flip()を使っても結果は同じ。

print(np.linspace(0, 10, 5))
# [ 0.   2.5  5.   7.5 10. ]

print(np.linspace(10, 0, 5))
# [10.   7.5  5.   2.5  0. ]

print(np.linspace(0, 10, 5)[::-1])
# [10.   7.5  5.   2.5  0. ]

print(np.flip(np.linspace(0, 10, 5)))
# [10.   7.5  5.   2.5  0. ]

多次元配列に変換

numpy.arange()にもnumpy.linspace()にも形状shapeを指定する引数はない。2dや3dなど多次元配列の連番や等差数列を生成したい場合はreshape()メソッドで変換します。

print(np.arange(12).reshape(3, 4))
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

print(np.arange(24).reshape(2, 3, 4))
# [[[ 0  1  2  3]
#   [ 4  5  6  7]
#   [ 8  9 10 11]]
#
#  [[12 13 14 15]
#   [16 17 18 19]
#   [20 21 22 23]]]


print(np.linspace(0, 10, 12).reshape(3, 4))
# [[ 0.          0.90909091  1.81818182  2.72727273]
#  [ 3.63636364  4.54545455  5.45454545  6.36363636]
#  [ 7.27272727  8.18181818  9.09090909 10.        ]]

print(np.linspace(0, 10, 24).reshape(2, 3, 4))
# [[[ 0.          0.43478261  0.86956522  1.30434783]
#   [ 1.73913043  2.17391304  2.60869565  3.04347826]
#   [ 3.47826087  3.91304348  4.34782609  4.7826087 ]]
#
#  [[ 5.2173913   5.65217391  6.08695652  6.52173913]
#   [ 6.95652174  7.39130435  7.82608696  8.26086957]
#   [ 8.69565217  9.13043478  9.56521739 10.        ]]]

シェア

関連カテゴリー

Python NumPy

NumPy配列ndarrayに要素・行・列を挿入、追加するinsertの使い方 NumPyでRGB画像の色チャンネルを分離して単色化、白黒化、色交換 NumPy配列の行・列ごとの合計、平均、最大、最小などを算出 NumPyのブロードキャスト(形状の自動変換) NumPyの配列ndarrayの欠損値np.nanを含む行や列を削除 NumPyでCSVファイルを読み込み・書き込み(入力・出力) NumPyで任意の行・列を削除するdeleteの使い方 NumPyの配列ndarrayの欠損値np.nanを他の値に置換 NumPy配列ndarrayの条件を満たす要素数をカウント pandas.DataFrame, SeriesとNumPy配列ndarrayを相互に変換 NumPy配列ndarrayの表示形式(桁数や指数表記、0埋めなど)を指定 NumPyで欠損値np.nanを含む配列ndarrayの合計や平均を算出 NumPy配列ndarrayをバイナリファイル(npy, npz)で保存 NumPy配列ndarrayの行・列を任意の順番に並べ替え、選択(抽出) Python, OpenCV, Pillow(PIL)で画像サイズ(幅、高さ)を取得

Last Updated: 6/26/2019, 10:34:03 PM