np.arange, дающий непредвиденное значение

#python

Вопрос:

Я использую np.arange для генерации действительных чисел от 0 до 8 (включая 8) с шагом 0,002, используя приведенную ниже команду

 import numpy as np
t=np.arange(0,8.002,0.002)
print(len(t))
print(t)
 

Он должен выдавать числа от 0 до 8, где каждое число превышает предыдущее число с шагом 0,002. Но это также дает последнее число 8.002, чего не должно быть.

Выход

 4002
[0.000e 00 2.000e-03 4.000e-03 ... 7.998e 00 8.000e 00 8.002e 00]
 

Но если я генерирую числа от 0 до 7 с шагом 0,002, то np.arange дает прекрасные результаты

 import numpy as np
t=np.arange(0,7.002,0.002)
print(len(t))
print(t)
 

Выход

 3501
[0.000e 00 2.000e-03 4.000e-03 ... 6.996e 00 6.998e 00 7.000e 00]
 

Кто-нибудь может сказать, как я могу исключить это последнее значение 8.002 при генерации чисел от 0 до 8 и почему происходит такое странное поведение ??

Комментарии:

1. Из документов : При использовании нецелочисленного шага, такого как 0.1, результаты часто не будут согласованными. Для этих случаев лучше использовать numpy.linspace.

2. Я понятия не имею, почему возникает проблема, но способ ее решить-изменить границы на 0,8.001 : t=np.arange(0,8.001,0.002) и это работает так, как ожидалось в обоих случаях

3. Также я заметил, что для 8.002 вы получаете 4002 значения, что составляет 8.002 // 0.002 1; с 7.002 вы получаете 3501 значение, что составляет 7.002 // 0.002 1. Может быть, это совпадение, но я думаю, что здесь есть закономерность. Я предполагаю, что arange возвращается к linspace при использовании нецелочисленных шагов , с num=(end-start) // step 1 , но это всего лишь предположение, может быть дико неправильным

4. @ Джулс Сивел, да, ваш подход работает. Спасибо

Ответ №1:

Вместо этого используйте Numpy Linspace

Вы сталкиваетесь с серьезной проблемой. Из документации по организации numpy :

При использовании нецелочисленного шага, такого как 0,1, результаты часто будут непротиворечивыми. Для этих случаев лучше использовать numpy.linspace.

Поэтому вместо этого используйте

 start= 0
stop= 8
stepsize= 0.002
stepcount = int(round((stop-start)/stepsize))
t=np.linspace(start,stop,stepcount)
print(len(t))
print(t)
 

Ответ №2:

Как было сказано выше, вы можете использовать linspace или добавить строку ниже в свой код, она просто удалит последний элемент.

 t.pop()