Home > Mobile >  Python turn hard code into loop that iterates through every element
Python turn hard code into loop that iterates through every element

Time:03-15

I was wondering how I would turn my hardcoding section into a loop? I have a very long array that would require me to iterate through every element, drop it, and apply the functions. but hard coding would take forever. ie. apply functions with everything but the first element then append to list, apply functions with everything but the second element then append to list, and so on

x1 = np.array([1,2,4,6])
y1 = np.array([2,4,6,3])
x2 = np.array([2,4,2,7])
y2 = np.array([2,5,3,4])
x3 = np.array([3,5,4,3])
y3 = np.array([2,6,1,2])
x4 = np.array([6,6,4,7])
y4 = np.array([8,9,8,4])

xs = np.array([x1,x2,x3,x4])
ys = np.array([y1,y2,y3,x4])

linear_r2 = []
quadratic_r2 = []

def linear_func(x, a, b):
    return (a * x)   b

def fit_r2(ydata, yfit):
    residuals = ydata - yfit 
    ss_res = np.sum(residuals**2)
    ss_tot = np.sum((ydata - np.mean(ydata))**2)
    r2 = 1 - (ss_res / ss_tot)
    return r2

#hardcoding
xs_1 = np.delete(xs,0,axis = 1) #deletes 0th element for all arrays
ys_1 = np.delete(ys,0,axis = 1) #deletes 0th element for all arrays
xdata = xs_1[0,:]
ydata = ys_1[0,:]
popt, _ = curve_fit(linear_func, xdata, ydata)
yfit = linear_func(xdata, *popt)
linear_1 = fit_r2(ydata,yfit)
linear_r2.append(linear_1)

xs_2 = np.delete(xs,1,axis = 1) ##deletes 1st element for all arrays
ys_2 = np.delete(ys,1,axis = 1)
xdata = xs_2[0,:]
ydata = ys_2[0,:]
popt, _ = curve_fit(linear_func, xdata, ydata)
yfit = linear_func(xdata, *popt)
linear_2 = fit_r2(ydata,yfit)
linear_r2.append(linear_2)

#and so on

CodePudding user response:

for ind in range(xs.shape[1]):
    xs_1 = np.delete(xs,ind,axis = 1) #deletes i-th element for all arrays
    ys_1 = np.delete(ys,ind,axis = 1) #deletes i-th element for all arrays

the rest is the same (all under the loop):

xdata = xs_1[0,:]
ydata = ys_1[0,:]
popt, _ = curve_fit(linear_func, xdata, ydata)
yfit = linear_func(xdata, *popt)
linear_1 = fit_r2(ydata,yfit)
linear_r2.append(linear_1)

CodePudding user response:

I don't think you need to delete at all. Try this:

for i in range(min(len(xs), len(ys))):
    xdata = xs_1[i,:]
    ydata = ys_1[i,:]
    popt, _ = curve_fit(linear_func, xdata, ydata)
    yfit = linear_func(xdata, *popt)
    linear_1 = fit_r2(ydata,yfit)
    linear_r2.append(linear_1)
  • Related