To store big matrix on disk I use numpy.memmap.
Here is a sample code to test big matrix multiplication:
import numpy as np
import time
rows= 10000 # it
Dask.array provides a numpy interface to large on-disk arrays using blocked algorithms and task scheduling. It can easily do out-of-core matrix multiplies and other simple-ish numpy operations.
Blocked linear algebra is harder and you might want to check out some of the academic work on this topic. Dask does support QR and SVD factorizations on tall-and-skinny matrices.
Regardless for large arrays, you really want blocked algorithms, not naive traversals which will hit disk in unpleasant ways.