Shouldn't we instead defer the copy to `atleast2d_or_csr`? I think the current code can make several copies of `X`. For example, if `self.copy=True`, if `X`i is not a float array, and if `X` is not right sparse format.