我已经看到类似问题的答案,但是我在代码中找不到将x视为整数的位置。
import matplotlib.pyplot as plt
import numpy as np
def aitken(x,y,value,n):
if n == 1:
return y[0]
first_array = x.pop(n-1)
second_array = x.pop(n-2)
first_y = y.pop(n-1)
second_y = y.pop(n-2)
n1 = n-1
return (aitken(first_array,first_y,value,n1)*(value - x[n-1]) - aitken(second_array, second_y,value,n1)*(value - x[n-2]))/(x[n-1] - x[n-2])
x = [1, 4, 7, 11, 15, 20, 30, 50, 77, 92, 100]
y = [5, 20, 52, 121, 228, 403, 903, 2504, 5929, 8464, 10005]
n = len(x)
x_fit = np.arange(0,104,1)
y_fit = aitken(x,y,x_fit,n)
以下是错误消息:
File "exl.py", line 17, in <module>
y_fit = aitken(x,y,x_fit,n)
File "exl.py", line 13, in aitken
return (aitken(first_array,first_y,value,n1)*(value - x[n-1]) - aitken(second_array, second_y,value,n1)*(value - x[n
-2]))/(x[n-1] - x[n-2])
File "exl.py", line 8, in aitken
first_array = x.pop(n-1)
AttributeError: 'int' object has no attribute 'pop'
很抱歉,这个问题太基本了。我是python的新手。
答案 0 :(得分:2)
您的变量first_array是一个int,因为它是列表x中的一个元素(均为int)。如果您不使用与主脚本中变量相同的名称作为函数参数,将会发现调试起来更容易。
答案 1 :(得分:1)
函数达到返回值后,您将其传递给了first_array,您认为它是一个列表。
first_array是一个整数,因为pop函数返回:
列表中的最后一个值或给定的索引值。
答案 2 :(得分:1)
您遇到的问题是因为递归调用数组时不再将数组传递给函数。
first_array = x.pop(n-1)
second_array = x.pop(n-2)
这不是给您一个数组,而是在位置(n-1)处的值。例如:
x = [1, 4, 7, 11, 15, 20, 30, 50, 77, 92, 100]
first_array = x.pop(n-1)
# first_array = 100
# x = [1, 4, 7, 11, 15, 20, 30, 50, 77, 92]
因此,当您传递first_array并尝试弹出x时,它不再是数组,并且会引发错误。相反,您将需要修改返回值,因此您无需传递标量,而是传递数组。希望对您有帮助,祝您好运。
答案 3 :(得分:1)
如果使用带有列表的弹出方法,则可以执行预期的操作:
x=[1,2,3]
f_array=x.pop(0)
print(f_array)
输出:
1
所以它不是一个列表,所以会出现错误, 因为您不能重新应用弹出变量,在这种情况下该变量是整数,因为删除的列表项是整数