Pseudoinverse gives you a solution of minimum norm; In your case matrix A has rank=15, so you have "quite large subspace of freedom" to choose another solution. From the following post you can find how to get any solution:
any_solution = np.linalg.pinv(A) @ b + (np.ones((20, 20)) - np.linalg.pinv(A)@A)@ y # y.shape = (20, 1)
y
is arbitrary vector. Choosing appropriate y
probably lead you to desirable solution.