同じ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を使うという棲み分けになっているようです。
作りたい数式の条件で使い分けが必要ですね。