I want to make this piece of Python code (loops) just a single line, but I don’t know how. My goal in this project is to prove that not always the smaller the code (in number of lines) the better, because its readability gets worse.
KE, ndof, K, F, U = KT, 2 * (nely + 1) * (nelx + 1), lil_matrix((2 * (nely + 1) * (nelx + 1), 2 * (nely + 1) * (nelx + 1))), zeros(2 * (nely + 1) * (nelx + 1)), zeros(2 * (nely + 1) * (nelx + 1))
for ely in range(1,nely+1):
for elx in range(1,nelx+1):
K[np.ix_([2*((nely+1)*(elx-1)+ely)-2, 2*((nely+1)*(elx-1)+ely)-1, 2*((nely+1)*elx+ely)-2, 2*((nely+1)*elx+ely)-1, 2*((nely+1)*elx+ely), 2*((nely+1)*elx+ely)+1, 2*((nely+1)*(elx-1)+ely), 2*((nely+1)*(elx-1)+ely)+1],[2*((nely+1)*(elx-1)+ely)-2, 2*((nely+1)*(elx-1)+ely)-1, 2*((nely+1)*elx+ely)-2, 2*((nely+1)*elx+ely)-1, 2*((nely+1)*elx+ely), 2*((nely+1)*elx+ely)+1, 2*((nely+1)*(elx-1)+ely), 2*((nely+1)*(elx-1)+ely)+1])] += x[ely-1,elx-1]**penal * KE
And the same thing in this case:
dcn = zeros((nely, nelx))
for i in range(nelx):
for j in range(nely):
dcn[j, i] = (dcn[j, i] + sum((rmin - ((i - k) ** 2 + (j - l) ** 2) ** 0.5) * (rmin - ((i - k) ** 2 + (j - l) ** 2) ** 0.5 > 0) * x[l, k] * dc[l, k] for k in range(int(max(i - round(rmin), 0)), int(min(i + round(rmin) + 1, nelx))) for l in range(int(max(j - round(rmin), 0)), int(min(j + round(rmin) + 1, nely))))) / (x[j, i] * ((sum((rmin - ((i - k) ** 2 + (j - l) ** 2) ** 0.5) * (rmin - ((i - k) ** 2 + (j - l) ** 2) ** 0.5 > 0) for k in range(int(max(i - round(rmin), 0)), int(min(i + round(rmin) + 1, nelx))) for l in range(int(max(j - round(rmin), 0)), int(min(j + round(rmin) + 1, nely)))))+((sum((rmin - ((i - k) ** 2 + (j - l) ** 2) ** 0.5) * (rmin - ((i - k) ** 2 + (j - l) ** 2) ** 0.5 > 0) for k in range(int(max(i - round(rmin), 0)), int(min(i + round(rmin) + 1, nelx))) for l in range(int(max(j - round(rmin), 0)), int(min(j + round(rmin) + 1, nely))))) == 0)))
I tried using list comprehension and np.sum, but it didn’t work. Also, I need to make a function containing those loops in a single line too:
def check(nelx, nely, rmin, x, dc):
dcn = zeros((nely, nelx))
for i in range(nelx):
for j in range(nely):
dcn[j, i] = (dcn[j, i] + sum((rmin - ((i - k) ** 2 + (j - l) ** 2) ** 0.5) * (rmin - ((i - k) ** 2 + (j - l) ** 2) ** 0.5 > 0) * x[l, k] * dc[l, k] for k in range(int(max(i - round(rmin), 0)), int(min(i + round(rmin) + 1, nelx))) for l in range(int(max(j - round(rmin), 0)), int(min(j + round(rmin) + 1, nely))))) / (x[j, i] * ((sum((rmin - ((i - k) ** 2 + (j - l) ** 2) ** 0.5) * (rmin - ((i - k) ** 2 + (j - l) ** 2) ** 0.5 > 0) for k in range(int(max(i - round(rmin), 0)), int(min(i + round(rmin) + 1, nelx))) for l in range(int(max(j - round(rmin), 0)), int(min(j + round(rmin) + 1, nely)))))+((sum((rmin - ((i - k) ** 2 + (j - l) ** 2) ** 0.5) * (rmin - ((i - k) ** 2 + (j - l) ** 2) ** 0.5 > 0) for k in range(int(max(i - round(rmin), 0)), int(min(i + round(rmin) + 1, nelx))) for l in range(int(max(j - round(rmin), 0)), int(min(j + round(rmin) + 1, nely))))) == 0)))
return dcn