Python 从scipy稀疏矩阵中提取非主对角线?
假设我有一个scipy.sparse格式的稀疏矩阵。如何提取主对角线以外的对角线?对于numpy数组,可以使用numpy.diag。是否有一个scipy稀疏等价物 例如:Python 从scipy稀疏矩阵中提取非主对角线?,python,numpy,scipy,sparse-matrix,Python,Numpy,Scipy,Sparse Matrix,假设我有一个scipy.sparse格式的稀疏矩阵。如何提取主对角线以外的对角线?对于numpy数组,可以使用numpy.diag。是否有一个scipy稀疏等价物 例如: from scipy import sparse A = sparse.diags(ones(5),1) 如何在不转换为numpy数组的情况下返回1的向量?当稀疏数组采用dia格式时,沿对角线的数据记录在偏移量和数据属性中: import scipy.sparse as sparse import numpy as np
from scipy import sparse
A = sparse.diags(ones(5),1)
如何在不转换为numpy数组的情况下返回1的向量?当稀疏数组采用
dia
格式时,沿对角线的数据记录在偏移量和数据属性中:
import scipy.sparse as sparse
import numpy as np
def make_sparse_array():
A = np.arange(ncol*nrow).reshape(nrow, ncol)
row, col = zip(*np.ndindex(nrow, ncol))
val = A.ravel()
A = sparse.coo_matrix(
(val, (row, col)), shape=(nrow, ncol), dtype='float')
A = A.todia()
# A = sparse.diags(np.ones(5), 1)
# A = sparse.diags([np.ones(4),np.ones(3)*2,], [2,3])
print(A.toarray())
return A
nrow, ncol = 10, 5
A = make_sparse_array()
diags = {offset:(diag[offset:nrow+offset] if 0<=offset<=ncol else
diag if offset+nrow-ncol>=0 else
diag[:offset+nrow-ncol])
for offset, diag in zip(A.offsets, A.data)}
for offset, diag in sorted(diags.iteritems()):
print('{o}: {d}'.format(o=offset, d=diag))
上面的代码生成
-9: [ 45.]
-8: [ 40. 46.]
-7: [ 35. 41. 47.]
-6: [ 30. 36. 42. 48.]
-5: [ 25. 31. 37. 43. 49.]
-4: [ 20. 26. 32. 38. 44.]
-3: [ 15. 21. 27. 33. 39.]
-2: [ 10. 16. 22. 28. 34.]
-1: [ 5. 11. 17. 23. 29.]
0: [ 0. 6. 12. 18. 24.]
1: [ 1. 7. 13. 19.]
2: [ 2. 8. 14.]
3: [ 3. 9.]
4: [ 4.]
上面的输出是打印偏移量,然后是该偏移量处的对角线
上面的代码应该适用于任何稀疏数组。我使用完全填充的稀疏数组只是为了更容易检查输出是否正确
-9: [ 45.]
-8: [ 40. 46.]
-7: [ 35. 41. 47.]
-6: [ 30. 36. 42. 48.]
-5: [ 25. 31. 37. 43. 49.]
-4: [ 20. 26. 32. 38. 44.]
-3: [ 15. 21. 27. 33. 39.]
-2: [ 10. 16. 22. 28. 34.]
-1: [ 5. 11. 17. 23. 29.]
0: [ 0. 6. 12. 18. 24.]
1: [ 1. 7. 13. 19.]
2: [ 2. 8. 14.]
3: [ 3. 9.]
4: [ 4.]