Я пытаюсь сделать пространственные производные и почти сумел получить все циклы из моего кода, но когда я пытаюсь суммировать все в конце, у меня проблема.Векторизовать разреженную сумму без scipy.sparse
У меня есть набор N~=250k
узлов. Я нашел индексы i,j
пар узлов с i.size=j.size=~7.5M
, которые находятся на определенном расстоянии поиска, первоначально исходящем от np.triu_indices(n,1)
, и прошли через последовательность булевых масок, чтобы смыть узлы, не влияющие друг на друга. Теперь я хочу подытожить влияние на каждый узел из других узлов.
настоящее время у меня это:
def sparseSum(a,i,j,n):
return np.array([np.sum(a[np.logical_or(i==k,j==k)],axis=0) for k in range(n)])
Это очень медленно. Я бы хотел что-то векторизовать. Если бы я был SciPy я мог сделать
def sparseSum(a,i,j,n):
sp=scipy.sparse.csr_matrix((a,(i,j)),shape=(n,n))+ scipy.sparse.csr_matrix((a,(j,i)),shape=(n,n))
return np.sum(sp, axis=0)
Но я делаю все это в рамках реализации Abaqus, который не включает в себя SciPy. Есть ли способ сделать это только для numpy?
Возможно, должно было бы добавить, что 'n = ~ 250k' и' i.size = ~ 7.6M'. Я думаю, что 'mask' может вызвать' memoryError', но я попробую –
Да, это зависает. 'mask' является булевским массивом 238GB по моим вычислениям –
@ DanielForsman Я предполагаю, что' a' является 2D-матрицей/матрицей. Сколько столбцов оно имеет? – Divakar