Может быть, вы можете взглянуть на Разреженную матрицу SciPy . В этом случае SciPy создает разреженную матрицу (оптимизированную для таких больших пустых матриц), и с ее форматом координат вы можете обращаться к данным и изменять их по своему усмотрению.
Из своей документации:
>>> from scipy.sparse import coo_matrix
>>> # Constructing a matrix using ijv format
>>> row = np.array([0, 3, 1, 0])
>>> col = np.array([0, 3, 1, 2])
>>> data = np.array([4, 5, 7, 9])
>>> m = coo_matrix((data, (row, col)), shape=(4, 4))
>>> m.toarray()
array([[4, 0, 9, 0],
[0, 7, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 5]])
Он создает не матрицу, а набор координат со значениями, который занимает гораздо меньше места, чем просто заполнение матрицы нулями.
>>> from sys import getsizeof
>>> getsizeof(m)
56
>>> getsizeof(m.toarray())
176