Просто смотрю на какое-то странное поведение в Python/Pandas.
Я знаю, что установка запутанная, я выполнял некоторые... задачи.
def lucas_n(n):
'''Return the fist n lucas numbers modulo 1_000_007'''
my_list = [1,3]
while len(my_list) < n:
my_list.append((my_list[-1]+my_list[-2])%1_000_007)
return my_list
def f(seq):
'''Look up https://projecteuler.net/problem=739'''
df = pd.Series(seq)
for i in range(len(seq)-1):
df = df.iloc[1:].cumsum()
return df.iloc[0]
x = lucas_n(1e4)
f(x)
>>> -8402283173942682253
Короче говоря, x
— это последовательность положительных целых чисел, а f
применяет последовательные .iloc[1:].cumsum()
операции.
И результат отрицательный...
Это ошибка? Проблема с типом данных?
ЭТО похоже, что он может перетекать между x = lucas_n(1e4)[0:4442]
и x = lucas_n(1e4)[0:4443]
Спасибо - в сочетании я рад признать, что в базовом бэкэнде C было переполнение. Если вы сформулируете это как ответ, я приму это.
Похоже, у вас целочисленное переполнение. В самом Python целые числа могут иметь произвольную точность, но поскольку pandas/numpy по умолчанию используют типы данных C, может произойти переполнение:
Чтобы решить эту проблему, вы можете вручную преобразовать данные в целые числа Python:
def f(seq):
'''Look up https://projecteuler.net/problem=739'''
df = pd.Series(seq).astype('int') # Casting to Python integer type
for i in range(len(seq)-1):
df = df.iloc[1:].cumsum()
return df.iloc[0]
Это решает проблему переполнения в моем тестировании.
Похоже на целочисленное переполнение или что-то в этом роде, потому что с
1e3
в качестве параметра все работает как задумано.