假設我有一個(稀疏)矩陣M
大小(N*N, N*N)
。我想從這個矩陣中選擇grid
((n,m)
數組,其中n*m=N
)爲True(它是一個布爾二維數組,以及na=grid.sum()
)的外積的矩陣元素。這可以如下循環大型稀疏陣列
result = M[np.outer(grid.flatten(),grid.flatten())].reshape ((N, N))
result
是(na,na)
稀疏陣列(和na < N
)來完成。前一行是我想要實現的:從grid
的乘積中獲得M的真元,並擠出那些不是真的出來的數組。
由於n
和m
(因此N
)成長,M
和result
是稀疏矩陣,我不能夠在內存或速度有效地做到這一點。我曾嘗試最接近的是:
result = sp.lil_matrix ((1, N*N), dtype=np.float32)
# Calculate outer product
A = np.einsum("i,j", grid.flatten(), grid.flatten())
cntr = 0
it = np.nditer (A, flags=['multi_index'])
while not it.finished:
if it[0]:
result[0,cntr] = M[it.multi_index[0], it.multi_index[1]]
cntr += 1
# reshape result to be a N*N sparse matrix
最後重塑可以通過this approach做,但我沒有到那一步,因爲while循環永遠走。
我也已經嘗試選擇A的非零元素太,和循環過但這吃光全部存儲器的:
A=np.einsum("i,j", grid.flatten(), grid.flatten())
nzero = A.nonzero() # This eats lots of memory
cntr = 0
for (i,j) in zip (*nzero):
temp_mat[0,cntr] = M[i,j]
cnt += 1
「n」和「M」在上面的例子中是300左右。
我在標題中加了'稀疏',因爲索引速度比普通'numpy'數組慢。 – hpaulj
儘管'lil'最適合索引賦值和查找,通常最好是直接操作輸入數組的'coo'風格,然後構建稀疏矩陣。查看'sparse.bmat'來看看如果使用'coo'格式構造一個複雜矩陣,'稀疏'如何。 – hpaulj
即使有'N = 4',你的'它'迭代永遠 - 從字面上看。你錯過了「下一個(它)」。 – hpaulj