等差数列を作る

同じstep数でインクリメントしていくような配列って、けっこう使用頻度が高いと思います。for文を回しても作れなくはないのですが、関数を使った2通りの作り方を見つけましたので、メモとして残しておきます。

linspace関数

配列の値の区間(start/stop)と何等分するか(N)を指定します。

numpy

【書式】 numpy.linspace(start, stop, N)

例えば、-1~+1までの区間を20等分したい場合は、

import numpy as np

# start:-1, stop:1, N:20の行列
a_np = np.linspace(-1,1,20)
print(a_np)

array([-1. , -0.89473684, -0.78947368, -0.68421053, -0.57894737, -0.47368421, -0.36842105, -0.26315789, -0.15789474, -0.05263158, 0.05263158, 0.15789474, 0.26315789, 0.36842105, 0.47368421, 0.57894737, 0.68421053, 0.78947368, 0.89473684, 1. ])

デフォルトでは”stop”の「+1」は区間に含まれるため、含みたくない場合は、「endpoint=False」を引数に入れます。

b_np = np.linspace(-1,1,20, endpoint=False)
print(b_np)             

array([-1. , -0.9, -0.8, -0.7, -0.6, -0.5, -0.4, -0.3, -0.2, -0.1, 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])

pytorch

pytorchの場合も使い方はnumpyとほとんど同じです。

a_torch = torch.linspace(-1,1,20)
print(a_torch)

tensor([-1.0000, -0.8947, -0.7895, -0.6842, -0.5789, -0.4737, -0.3684, -0.2632, -0.1579, -0.0526, 0.0526, 0.1579, 0.2632, 0.3684, 0.4737, 0.5789, 0.6842, 0.7895, 0.8947, 1.0000])

stopも分割に含まれるところも同じですが、numpyと違い、endpoint=Falseは使えません。

b_torch = torch.linspace(-1,1,20,endpoint=False)                    

Traceback (most recent call last): File “”, line 1, in
TypeError: linspace() received an invalid combination of arguments – got (int, int, int, endpoint=bool), but expected one of:
(Number start, Number end, Tensor out, torch.dtype dtype, torch.layout layout, torch.device device, bool requires_grad)
(Number start, Number end, int steps, Tensor out, torch.dtype dtype, torch.layout layout, torch.device device, bool requires_grad)

同じことをやるならどうすればいいかを考えてみました。N+1の配列を作って、Nまでを取り出すのはひとつの手でしょうか。
もしかしたら、普通に関数があるのかもしれませんが……

n_21 = torch.linspace(-1, 1, 21)
n_20 = n_21[:-1]           

# N=21
tensor([-1.0000, -0.9000, -0.8000, -0.7000, -0.6000, -0.5000, -0.4000, -0.3000, -0.2000, -0.1000, 0.0000, 0.1000, 0.2000, 0.3000, 0.4000, 0.5000, 0.6000, 0.7000, 0.8000, 0.9000, 1.0000])

# N=20まで取り出し
tensor([-1.0000, -0.9000, -0.8000, -0.7000, -0.6000, -0.5000, -0.4000, -0.3000, -0.2000, -0.1000, 0.0000, 0.1000, 0.2000, 0.3000, 0.4000, 0.5000, 0.6000, 0.7000, 0.8000, 0.9000])

arange関数

配列の値の区間とstepの指定により数列を生成します。
(分割数(N)は指定しません)

numpy

【書式】numpy.linspace(start, stop, step=1)

stepはデフォルトで1ですので、下のように何も指定しない場合は整数の配列が生成されます。arangeの場合は、stopの値は配列に含まれないのですね。

x_np = np.arange(0,5)
print(x_np)

array([0, 1, 2, 3, 4])

pytorch

PyTorchの場合もnumpyと同じです。

x_torch = torch.arange(0,5)
print(x_torch)

tensor([0, 1, 2, 3, 4])

また、stepの数字を0.1にしてみると、0.1ごとにインクリメントする数列が生成されました。

x_torch = torch.arange(-1,1,0.1)
print(x_torch)

tensor([-1.0000, -0.9000, -0.8000, -0.7000, -0.6000, -0.5000, -0.4000, -0.3000, -0.2000, -0.1000, 0.0000, 0.1000, 0.2000, 0.3000, 0.4000, 0.5000, 0.6000, 0.7000, 0.8000, 0.9000])

まとめ

linspaceとarangeは両方とも等差数列を作る関数ですが、分割数が決まっている場合はlinspace、step数が決まっている場合はarangeを使うという棲み分けになっているようです。

作りたい数式の条件で使い分けが必要ですね。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です