Соответствующая часть документов r_
:
Однако, если step
является мнимым числом (т. Е. 100j), то его целочисленная часть интерпретируется как число точекжелательно и начало и остановка включительно.Другими словами start:stop:stepj
интерпретируется как np.linspace(start, stop, step, endpoint=1)
внутри скобок.
Это нотационный трюк, используемый в паре классов в numpy/lib/index_tricks.py
(mgrid
это другое).Это не общий numpy
или трюк с питоном.Ключевым является использование определения class
(не функции) и пользовательского метода __getitem__
.
Что касается числовых деталей, проверьте код для np.linspace
.(MATLAB имеет функцию с тем же именем).
Возможно, это сравнение с arange
поможет создать интуитивно понятное чувство.
In [65]: np.arange(-1,1.01,.2)
Out[65]:
array([-1.00000000e+00, -8.00000000e-01, -6.00000000e-01, -4.00000000e-01,
-2.00000000e-01, -2.22044605e-16, 2.00000000e-01, 4.00000000e-01,
6.00000000e-01, 8.00000000e-01, 1.00000000e+00])
In [66]: _.shape
Out[66]: (11,)
In [67]: np.linspace(-1,1,11)
Out[67]: array([-1. , -0.8, -0.6, -0.4, -0.2, 0. , 0.2, 0.4, 0.6, 0.8, 1. ])
arange
выдало 11 значений, поэтому нам пришлось использовать тот же номер размера в linspace
,Обратите внимание, что linspace
обработка конечной точки более приятна, что приводит к более четкому отображению значений с плавающей запятой (которые не являются точными в любом случае).
Если вместо этого мы используем 10, интервал будет правильным (.2222 ... * 9 = 1,9999 ....).Чтобы получить 10 значений, мы должны сделать 9 шагов.Или разделите диапазон на 9 интервалов.
In [68]: np.linspace(-1,1,10)
Out[68]:
array([-1. , -0.77777778, -0.55555556, -0.33333333, -0.11111111,
0.11111111, 0.33333333, 0.55555556, 0.77777778, 1. ])
arange
с плавающей точкой сложнее, чем эквивалент, начинающийся с целых чисел:
In [70]: np.arange(-10,11,2)/10
Out[70]: array([-1. , -0.8, -0.6, -0.4, -0.2, 0. , 0.2, 0.4, 0.6, 0.8, 1. ])