#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()