假设我有一个(稀疏)矩阵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