雖然不是構建一個稀疏矩陣的最快的方法,這是不是可怕的緩慢或者,至少不是lil
分配步驟:
In [204]: N=100
In [205]: M=sparse.lil_matrix((N,N))
In [206]: for i in range(N):
...: for j in range(N):
...: M[i,j]=(i==j)
In [207]: M
Out[207]:
<100x100 sparse matrix of type '<class 'numpy.float64'>'
with 100 stored elements in LInked List format>
它保存的只是非零值M
。我幾乎看不到循環中的延遲。
所以我的猜測是,大部分的時間都在panadas
索引表達式是花:
np.sum(data[data['source_node']==i].destination_node.isin(data[data['source_node']==j].destination_node))
轉換數據,經常是文本,進入coocurance數稀疏矩陣經常出現。它們用於學習代碼,模式搜索等。經常使用scikit-learn
。也tensorflow
。
對於N = 1000
In [212]: %%timeit
...: M=sparse.lil_matrix((N,N))
...: for i in range(N):
...: for j in range(N):
...: M[i,j]=(i==j)
...:
1 loop, best of 3: 7.31 s per loop
迭代到密集陣列分配這些值快,即使我們包括在端部轉換到稀疏。
In [213]: %%timeit
...: M=np.zeros((N,N))
...: for i in range(N):
...: for j in range(N):
...: M[i,j]=(i==j)
...:
1 loop, best of 3: 353 ms per loop
In [214]: %%timeit
...: M=np.zeros((N,N))
...: for i in range(N):
...: for j in range(N):
...: M[i,j]=(i==j)
...: M = sparse.lil_matrix(M)
...:
1 loop, best of 3: 353 ms per loop
但是對於非常大的情況,創建中間密集數組可能會遇到內存問題。
向我們展示您的代碼將是一個好的開始。並且10^12的計算是過高的。 –
你的矩陣多麼稀疏?通常情況下,一個使用字典的方法至關重要的是矩陣座標工作。 – jsbueno
這是Python 2還是3?如果是2,則應該使用'xrange'而不是'range'。 –