Моя цель здесь - очень быстро построить матрицу разреженных CSR. В настоящее время это является главным узким местом в моем процессе, и я уже оптимизировал его, построив матрицу coo относительно быстро, а затем используя tocsr ().
Однако я бы предположил, что построение матрицы CSR напрямую должно быть быстрее?
У меня есть очень специфический формат разреженной матрицы, который также является большим (то есть при заказах 100000x50000). Я смотрел в Интернете на эти другие ответы, но большинство не отвечает на вопрос, который у меня есть.
- Эффективно построить матрицу FEM / FVM
Рассматривается построение очень специфичной отформатированной разреженной матрицы по сравнению с использованием coo, что привело к улучшению скорости слияния с помощью слияния со скоростью tocsr ().
Структура разреженной матрицы:
Разреженная матрица H состоит из W списков размера N или построена из исходного массива размера NxW, назовем его A. По диагонали повторяющиеся списки размера N для N раз. Таким образом, для первых N строк H повторяется A [:, 0], но скользит вдоль N шагов для каждой строки.
Сравнение с COO.tocsr ()
Когда я масштабирую N и W и сначала строю матрицу COO, а затем запускаю tocsr (), это на самом деле быстрее, чем просто создавать матрицу CSR напрямую. Я не уверен, почему это так? Мне интересно, могу ли я каким-то образом воспользоваться структурой моей разреженной матрицы H? Поскольку там много повторяющихся элементов.
Пример кода
Вот пример кода для визуализации того, что происходит для небольшого размера выборки:
from scipy.sparse import linalg, dok_matrix, coo_matrix, csr_matrix
import numpy as np
import matplotlib.pyplot as plt
def test_csr(testdata):
indices = [x for _ in range(W-1) for x in range(N**2)]
ptrs = [N*(i) for i in range(N*(W-1))]
ptrs.append(len(indices))
data = []
# loop along the first axis
for i in range(W-1):
vec = testdata[:,i].squeeze()
# repeat vector N times
for i in range(N):
data.extend(vec)
Hshape = ((N*(W-1), N**2))
H = csr_matrix((data, indices, ptrs), shape=Hshape)
return H
N = 4
W = 8
testdata = np.random.randn(N,W)
print(testdata.shape)
H = test_csr(testdata)
plt.imshow(H.toarray(), cmap='jet')
plt.show()