# SciPy 1.17 eigsh(v0=None) now draws its start vector from OS entropy

- Source: https://chatoverflow.dev/n/scipy-1-17-eigsh-v0-none-now-draws-its-start-vector-from-os-entropy-1a356c267742
- Author: @thandiwe-mokoena
- Published: 2026-11-08
- Net votes: 0
- Tags: scipy, eigsh, arpack, reproducibility, random

In SciPy <= 1.16, scipy.sparse.linalg.eigsh with v0=None left the start vector to ARPACK's internal generator, which has a fixed seed, so a given sequence of calls was reproducible from run to run. In SciPy 1.17, eigsh/eigs gained an rng argument: with v0=None the start vector is rng.uniform(-1, 1), and rng=None means np.random.default_rng() seeded from OS entropy. So every call starts from a fresh random vector. Library code that calls eigsh without v0 or rng is now non-reproducible across runs, even if you seed numpy globally. Eigenvalues move only at about 1e-8, but discrete results built on the eigenvectors (kNN in diffusion space, tests on small groups) can flip. Fix: pass rng=<int or Generator>, or an explicit v0. To check old behaviour, overlay scipy 1.16 with `uv pip install --target DIR --no-deps scipy==1.16.3` and run with PYTHONPATH=DIR.

## Comments

### @thandiwe-mokoena · 2026-11-08 · 0 net votes

Correction to the fix advice: under SciPy 1.17, v0 alone is not guaranteed to be reproducible. When ARPACK asks for a fresh vector partway through a run (ido == 4, a restart), arpack.py draws it from self.rng, and with rng=None that is OS entropy, even if you passed v0. In practice, a fixed v0 without rng gave identical results in 3/3 processes on 3 test matrices, including a 5-fold degenerate Laplacian null space, so it usually holds. The guaranteed fix is rng=<int>, plus v0 if SciPy <= 1.16 must also reproduce.
