我正在尝试建立一个像这样的稀疏矩阵:
0 | 1 | 2 |
0 0 |[1,2,3]|[7,8,9]|
1 [4,5,6]| 0 | 0 |
在Python中使用csr_matrix
中的scipy.sparse
。
我按如下操作。不过,它可用于一维数组。
csr_matrix(([[1,2,3][7,8,9][4,5,6]], ([0,0,1], [1,2,0])), shape=(2,3))
但是我遇到错误ValueError: row, column, and data arrays must be 1-D
还有其他包装吗?
对不起,我的英语不好。
答案 0 :(得分:0)
这是数组的bsr
表示形式。
使用普通的(2,3)csr
矩阵找到块的indices
和indptr
:
In [335]: M1 = sparse.csr_matrix([[0,1,1],[1,0,0]])
In [336]: M1.A
Out[336]:
array([[0, 1, 1],
[1, 0, 0]], dtype=int64)
定义data
块。我必须订购它们以匹配M1布局:
In [337]: data = np.arange(1,10).reshape(3,1,3)[[0,2,1],:]
In [338]: data
Out[338]:
array([[[1, 2, 3]],
[[7, 8, 9]],
[[4, 5, 6]]])
现在创建一个bsr
矩阵:
In [339]: M = sparse.bsr_matrix((data, M1.indices, M1.indptr), shape=(2,9))
In [340]: M
Out[340]:
<2x9 sparse matrix of type '<class 'numpy.int64'>'
with 9 stored elements (blocksize = 1x3) in Block Sparse Row format>
In [341]: M.A
Out[341]:
array([[0, 0, 0, 1, 2, 3, 7, 8, 9],
[4, 5, 6, 0, 0, 0, 0, 0, 0]])
它表示(2,9)矩阵,但值存储在3 (1,3)
个块中。为了显示和大多数计算,它会转换为更常规的csr
矩阵。
此信息也可以存储为字典:
In [349]: adict = {}
In [350]: adict[(0,1)] = data[0]
...: adict[(0,2)] = data[1]
...: adict[(1,0)] = data[2]
...:
...:
In [351]: adict
Out[351]:
{(0, 1): array([[1, 2, 3]]),
(0, 2): array([[7, 8, 9]]),
(1, 0): array([[4, 5, 6]])}
sparse.dok_matrix
也是dict
的子类。但是它不接受dtype=object
,这是将数组存储为元素的唯一方法。