Don't depend on numpy