Форум сайта python.su
0
Всем привет!
Собственно, как сгенерировать последовательность в указанном диапазоне с экспоненциальным шагом? -
Я пробовал использовать numpy:logspace,linspace,arrang. Геометрическую прогрессию сгенерировать вполне реально, но переменного шага добиться не получается.
Спасибо!
Отредактировано ElfStone (Ноя. 14, 2015 12:52:19)
Офлайн
186
Так подойдёт?
>>> import math >>> map(math.exp, xrange(10)) [1.0, 2.718281828459045, 7.38905609893065, 20.085536923187668, 54.598150033144236, 148.4131591025766, 403.4287934927351, 1096.6331584284 585, 2980.9579870417283, 8103.083927575384]
Отредактировано Rodegast (Ноя. 14, 2015 15:07:13)
Офлайн
1
Это только в python 2.x будет работать, где есть xrange(). Вот нагуглил такое
Офлайн
186
> Это только в python 2.x будет работать, где есть xrange()
Конечно. В 3.х надо писать range.
Офлайн
1
Ну ок, но range() для другого - он целочисленный тип только принимает
Офлайн
0
map(math.exp, xrange(10))/map(math.exp, range(10)) - конечно красиво, но смысл экспоненциального шага не в том что разность между соседними элементами составляет 2.7 а в том что сам шаг изменяется. Т.е. этот код как раз пример линейного шага и рабочий
Офлайн
857
ElfStoneПриведи пример последовательности и шагов в ней.
Собственно, как сгенерировать последовательность в указанном диапазоне с экспоненциальным шагом?
ElfStoneНеэквидистантный и экспоненциальный - это разные понятия.
но смысл экспоненциального шага не в том что разность между соседними элементами составляет 2.7 а в том что сам шаг изменяется
Отредактировано py.user.next (Ноя. 17, 2015 04:20:26)
Офлайн
20
ElfStoneСделать точно экспоненциальный шаг не получится - понятно, что шаг в итерациях может быть только целым числом. Но можно легко сделать переменный (или, как вы его называете, “не эквидистантный”) целочисленный шаг, у которого с точностью до округления к ближайшему целому изменение следует экспоненциальному закону:
Собственно, как сгенерировать последовательность в указанном диапазоне с экспоненциальным шагом?
from math import exp, ceil X = list(map(lambda i: ceil(exp(i)), range(5))) Y = list(range(56)) # элементы int в списке только для простоты, вообще можно любые Z = [] # сюда добавляем элементы из Y, выбирая их с (почти) экспоненциально меняющимся шагом for i in X: Z.append(Y[i])
Офлайн
857
old_montyШаг может быть любым числом, хоть комплексным. Ему просто range() не подходит.
шаг в итерациях может быть только целым числом
Офлайн
186
> Ну ок, но range() для другого - он целочисленный тип только принимает
А мы ему челочисленный тип и передаём
Просто сначала генерим целочисловую последовательность, а потом к ней применяем нужную функцию и получаем то что хотим.
Офлайн