NumPyのarange関数で等差数列の配列を生成する方法

np.arange関数は、数値が連続したリストを素早く作る時に非常によく使います。使い方は、Pythonのrange関数とほとんど同じですが、np.arangeの方が遥かに高速です。

また、似たような関数にnp.linspace関数があります。こちらの方が、np.arange関数と比べて、内部処理上、小数の計算の精度が高いという特徴があります。そのため、基本的には小数の等差数列の生成にはnp.linspace関数が適しています。一方で、整数の等差数列の生成にはnp.arange関数を使うと良いでしょう。

np.linspace関数については、以下のページで解説しています。

ここでは、このnp.arange関数について解説します。

目次

1. 書式

まずは基本的な書き方を確認しましょう。

numpy.arange

書き方:

np.arange([start,] stop, [step,] dtype=None)

パラメーター:

start: 数値(オプション)
開始数値を指定します。ここで指定した数値は、生成される配列に含まれます。デフォルトは0です。
stop: 数値
終了数値を指定します。ここで指定した数値は生成される配列に含まれません。
step: 間隔(公差)(オプション)
数値の間隔(公差)を指定します。デフォルトは1です。
dtype: データ型(オプション)
出力する配列のデータ型を指定します。デフォルトはNoneでは、start や stop に渡した数値のデータ型から類推します。

戻り値: 

ndarray:
等差数列の配列を返します。型が浮動小数点数(float)の場合は、生成される配列の長さは ceil((stop-start)/step) になります。そのため、生成される配列の最後の要素は、stop で指定した値を超える可能性があります。

一緒に確認したい属性:

  • linspace: 任意の要素数の等差数列の配列を生成
  • ogrid:
  • mgrid:

2. サンプルコード

それでは、実際のコードを見て一通り確認していきましょう。

終了数値 (stop)のみを指定

引数に stop だけを渡すと(数値を1つだけ渡すと)、0以上指定の数値までの公差1の等差配列を生成します。stop の数値は生成される配列には含まれない点をご確認ください。

In [1]:
import numpy as np
np.arange(5)  #  連番の配列を生成。
Out[1]:
array([0, 1, 2, 3, 4])

引数には小数を渡すこともできます。その場合、以下のように要素がfloat型の配列を生成します。

In [2]:
np.arange(5.0)  #  小数を渡すと要素の型がfloat型になります。
Out[2]:
array([0., 1., 2., 3., 4.])

小数点以下の数値が0ではない小数を渡した場合でも、生成される配列は0から始まる公差1の等差数列になります。

In [3]:
import numpy as np
np.arange(6.7)
Out[3]:
array([0., 1., 2., 3., 4., 5., 6.])

開始数値(start)と終了数値(stop)を指定

開始数値mと終了数値nを指定すると、mで始まり、n-1で終わる配列を生成します。

In [4]:
np.arange(1, 11)  #  1から10の連番の配列を生成。
Out[4]:
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])

この場合は、引数に終了位置(stop)だけを渡す場合と違って、小数点以下が0以外の数値を指定した場合も意図した通りに機能します。

以下のコードをご覧ください。

In [4]:
np.arange(0.5, 5.5)  #  0.5から4.5の連番の配列を生成。
Out[4]:
array([0.5, 1.5, 2.5, 3.5, 4.5])

小数点以下の桁数は自由です。

In [6]:
np.arange(0.11, 3.11)  #  任意の小数点以下の桁数で生成可能。
Out[6]:
array([0.11, 1.11, 2.11])

間隔(step)を指定

任意の公差の数値配列を生成したい場合は、第三引数で指定します。例えば、偶数の配列を生成するには次のように書きます。

In [7]:
np.arange(0, 11, 2)  #  0から10までの公差2の数値の配列を生成。
Out[7]:
array([ 0,  2,  4,  6,  8, 10])

小数も指定可能です。指定した公差の配列を生成します。

In [8]:
np.arange(0, 2, 0.2)  #  公差は小数点でも可能。
Out[8]:
array([0. , 0.2, 0.4, 0.6, 0.8, 1. , 1.2, 1.4, 1.6, 1.8])

ステップに負の数値を指定すると、数値逆順の配列を生成します。この場合、開始位置を終了位置よりも大きい数値にする必要があります。

In [9]:
np.arange(3, -1, -0.5)  #  負の値の公差(逆順)も可能。
Out[9]:
array([ 3. ,  2.5,  2. ,  1.5,  1. ,  0.5,  0. , -0.5])

なお、step をポジション引数として指定する場合は、その前に必ず start と stop が指定されている必要があります。しかし、step をキーワード引数として指定する場合はその限りではありません。

In [10]:
np.arange(10, step=2)
Out[10]:
array([0, 2, 4, 6, 8])

要素の型を指定

オプション引数 dtype= で、配列の要素の型を明示することができます。要素の型については、『NumPyのdtype属性の一覧と参照・指定・変更方法』で解説しています。

dtype= で指定した型と、start や stop で指定した数値の型が異なる場合は前者が優先されます。

次のコードでは、整数で終了位置を指定していますが、dtype=float を指定しているので、生成される配列の型はfloat型になっています。

In [10]:
np.arange(5, dtype=float)  #  dtypeでfloat型(浮動小数点数)を指定。
Out[10]:
array([0., 1., 2., 3., 4.])

反対に、浮動小数点数で終了位置を指定して、「dtype=int」で要素の型をint型に指定すると、要素の型が整数の配列を生成します。

In [11]:
np.arange(5.0, dtype=int)  #  dtypeでint型(整数)を指定。
Out[11]:
array([0, 1, 2, 3, 4])

この場合、小数点以下は全て切り捨てられます。

In [12]:
np.arange(0.5, 3, 0.5, dtype=int)  #  小数点以下は切り捨て
Out[12]:
array([0, 1, 2, 3, 4])

重要:np.arangeで多次元配列を生成する方法
np.arange関数で生成される配列は1次元配列です。多次元配列を生成したい場合は、reshapeメソッドと併用する方法がよく使われます。

以下のコードのように使います。

なお、reshapeメソッドについては、『numpy.reshape – 配列の形状(shape)を変換』で解説しています。

In [13]:
np.arange(10).reshape(2, 5)
Out[13]:
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])

以下のコードは、0.1から1.5の数値を0.1刻みで生成し、reshape()メソッドで次元数を5、要素数を3にしたものです。

In [14]:
np.arange(0.1, 1.6, 0.1).reshape(5, 3)
Out[14]:
array([[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]])

補足:np.arange関数とrange関数の速度比較
実は、Python組み込みのrange関数は、NumPy配列を生成する時にも使えます。しかしnp.arange関数の方が処理速度が遥かに高速です。

参考に、以下を見比べてみてください。

同じ配列をrange関数で生成した場合と、np.arange関数で生成した場合の速度の違いです。

In [15]:
%%timeit - 100000  #  range()関数でNumPy配列を生成した時の平均処理速度。
np.array(range(10))
4.99 µs ± 35.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [16]:
%%timeit - 100000  #  np.arange()関数でNumPy配列を生成した時の平均処理速度。
np.arange(10)
498 ns ± 8.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

ご覧のように、range関数では約5マイクロ秒かかるのに対して、np.arange関数では約500ナノ秒と10倍もの違いがあります。

3. まとめ

np.arange関数のポイントをまとめておきます。

  • Python組み込みのrange関数と異なり小数の連続数値を生成することができる。
  • オプション引数「dtype=」で要素の型を指定することができる。
  • Python組み込みのrange関数よりもはるかに高速に動作する。

なお、np.linspace関数も、同じように任意の数値の範囲の配列を簡単に生成することができる関数です。np.arange関数と併せて使いこなせるようにしておくと良いでしょう。



よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次
閉じる