Вы смотрели на scipy.sparse
? Здесь нет смысла заново изобретать колесо. Разреженные матрицы - довольно стандартная вещь.
(В этом примере я использую матрицу 300000x4
для упрощения печати после умножения. Матрица 300000x1000
не должна представлять собой никаких проблем. Однако это будет намного быстрее, чем умножение двух плотных массивов, если у вас есть большинство 0
элементов.)
import scipy.sparse
import numpy as np
# Make the result reproducible...
np.random.seed(1977)
def generate_random_sparse_array(nrows, ncols, numdense):
"""Generate a random sparse array with -1 or 1 in the non-zero portions"""
i = np.random.randint(0, nrows-1, numdense)
j = np.random.randint(0, ncols-1, numdense)
data = np.random.random(numdense)
data[data <= 0.5] = -1
data[data > 0.5] = 1
ij = np.vstack((i,j))
return scipy.sparse.coo_matrix((data, ij), shape=(nrows, ncols))
A = generate_random_sparse_array(4, 300000, 1000)
B = generate_random_sparse_array(300000, 5, 1000)
C = A * B
print C.todense()
Это дает:
[[ 0. 1. 0. 0. 0.]
[ 0. 2. -1. 0. 0.]
[ 1. -1. 0. 0. 0.]
[ 0. 0. 0. 0. 0.]]