使用来自另一个矩阵的数字符号创建稀疏矩阵

时间:2017-08-07 22:19:06

标签: python numpy matrix scipy sparse-matrix

我需要创建一个稀疏矩阵,其中包含来自另一个矩阵示例的数字符号和坐标:

A = array([[ 1  3 -2]
           [-3  4 -6]
           [ 4  7 -5]])

B = array([[1 2]
           [1 3]
           [2 3]
           [2 4]
           [2 5]
           [3 4]
           [4 5]])

Result sparce matrix:
    1   2   3   4   5   6   7
1[[ 1  -1   1   0.  0.  0.  0.]
2 [ 0.  0. -1   1   0. -1   0.]
3 [ 0.  0.  0.  1  -1   0.  1 ]]

行数由矩阵A中的行数定义,列数由另一个矩阵B的行数定义,数字1或-1根据它们各自的数量填充专栏,例如:

First row matrix A [ 1  3 -2 ]
Result sparse [ 1  -1   1   0.  0.  0.  0.]    

1个第一列,-1个第二列,第1个第3列,其余列为0。 应该以这种方式在所有行上完成。对于矩阵B,也必须创建一个稀疏矩阵,但另一种方式是例如:

列数必须为5,行数由矩阵B的行数定义。但在此矩阵B中,第一列中的所有数字必须为( - ),然后必须在与矩阵A相同的方式来创建稀疏矩阵,例如:

B = array([[1 2]
           [1 3]
           [2 3]
           [2 4]
           [2 5]
           [3 4]
           [4 5]])

Result matrix B all numbers in the first column (-)
B = array([[-1 2]
           [-1 3]
           [-2 3]
           [-2 4]
           [-2 5]
           [-3 4]
           [-4 5]])

Result sparse matrix:
   1   2   3   4   5
1[ -1  1  0.  0.  0.]
2[ -1  0.  1  0.  0.]
3[ 0.  -1  1  0.  0.]
4[ 0.  -1  0.  1  0.]
5[ 0.  -1  0.  0.  1]
6[ 0.  0.  -1  1  0.]
7[ 0.  0.  0.  -1  1]]

我被提示使用scipy.sparse.coo_matrix,尝试了几种方法但无法做到

1 个答案:

答案 0 :(得分:0)

我刚刚给出了在Python create an empty sparse matrix

中制作稀疏矩阵的示例

但对于这种情况:

In [72]: A = np.array([[1,3,-2],[-3,4,-6],[4,7,-5]])
In [73]: A
Out[73]: 
array([[ 1,  3, -2],
       [-3,  4, -6],
       [ 4,  7, -5]])

绝对值A的列号(但需要偏移量)

In [74]: cols = abs(A.ravel())
In [75]: cols
Out[75]: array([1, 3, 2, 3, 4, 6, 4, 7, 5])

行号只是重复的A行号

In [76]: rows = np.arange(A.shape[0]).repeat(3)
In [77]: rows
Out[77]: array([0, 0, 0, 1, 1, 1, 2, 2, 2])

数据是A的标志。

In [78]: data = np.sign(A).ravel()
In [79]: data
Out[79]: array([ 1,  1, -1, -1,  1, -1,  1,  1, -1])

将这些提供给coo_matrix构造函数。请注意,我使用cols-1,因为索引从0开始,而不是1:

In [80]: M = sparse.coo_matrix((data, (rows, cols-1)), shape=(3,7))
In [81]: M
Out[81]: 
<3x7 sparse matrix of type '<class 'numpy.int32'>'
    with 9 stored elements in COOrdinate format>
In [82]: M.A       # viewed as an array
Out[82]: 
array([[ 1, -1,  1,  0,  0,  0,  0],
       [ 0,  0, -1,  1,  0, -1,  0],
       [ 0,  0,  0,  1, -1,  0,  1]])

对于计算和许多其他操作,sparse会将此转换为csr格式。

todo - B矩阵