T      # right singular vectors
>>> A = u @ diags_array(s) @ vT

With only three singular values/vectors, the SVD approximates the original
matrix.

>>> u2, s2, vT2 = svds(A, k=3, solver='lobpcg')
>>> A2 = u2 @ np.diag(s2) @ vT2
>>> np.allclose(A2, A.toarray(), atol=1e-3)
True

With all five singular values/vectors, we can reproduce the original
matrix.

>>> u3, s3, vT3 = svds(A, k=5, solver='lobpcg')
>>> A3 = u3 @ np.diag(s3) @ vT3
>>> np.allclose(A3, A.toarray())
True

The singular values match the expected singular values, and the singular
vectors are as expected up to a difference in sign.

>>> (np.allclose(s3, s) and
...  np.allclose(np.abs(u3), np.abs(u.todense())) and
...  np.allclose(np.abs(vT3), np.abs(vT.todense())))
True

The singular vectors are also orthogonal.

>>> (np.allclose(u3.T @ u3, np.eye(5)) and
...  np.allclose(vT3 @ vT3.T, np.eye(5)))
True

Nr