Note: scipy.sparse not needed