note.nkmk.me

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

Date: 2018-12-25 / tags: Python, NumPy

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

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

  • 間隔(公差)を指定する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の値も結果に含まれる。

引数endpointFalseとすると、結果に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を取得したい場合は引数retstepTrueとする。

(結果の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つ目の要素を指定すればOK。

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()を使うと楽。

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.        ]]]
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事