scipy 这个稀疏矩阵是如何创建的?

cczfrluj  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(191)

在检查下面的笔记本时,我对他是如何创建稀疏矩阵M感到困惑,我试图理解coo_matrix在这种情况下是如何工作的,但在查找函数的scipy文档后无法得到它。特别是代码块如下:

import scipy.sparse as sparse   
n = len(Y)
k = theta.shape[0]
data = [1]*n

M = sparse.coo_matrix((data, (Y, range(n))), shape=(k,n)).toarray()

从:https://www.kaggle.com/code/synnfusion/softmax-on-mnist-from-scratch/notebook
Y是mnist数据集中标签(数字0-9)的矢量。

  • 谢谢-谢谢
goucqfw6

goucqfw61#

In [90]: from scipy import sparse

进行输入:

In [91]: Y = np.array([0,3,2,1,5,5,3])    
In [92]: n=len(Y)    
In [93]: data = [1]*n

制作稀疏矩阵:

In [94]: M = sparse.coo_matrix((data, (Y, range(n))), shape=(10,n))

从不同的Angular 来看:

In [95]: M
Out[95]: 
<10x7 sparse matrix of type '<class 'numpy.int32'>'
    with 7 stored elements in COOrdinate format>

In [96]: print(M)
  (0, 0)    1
  (3, 1)    1
  (2, 2)    1
  (1, 3)    1
  (5, 4)    1
  (5, 5)    1
  (3, 6)    1

In [97]: M.toarray()
Out[97]: 
array([[1, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 1, 0, 0, 0],
       [0, 0, 1, 0, 0, 0, 0],
       [0, 1, 0, 0, 0, 0, 1],
       [0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 1, 1, 0],
       [0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0]])

该矩阵有3个关键属性,应与输入密切匹配:

In [98]: M.data
Out[98]: array([1, 1, 1, 1, 1, 1, 1])    
In [99]: M.row
Out[99]: array([0, 3, 2, 1, 5, 5, 3])    
In [100]: M.col
Out[100]: array([0, 1, 2, 3, 4, 5, 6], dtype=int32)

给定这样的输入,创建矩阵并没有太多的工作--直接接受输入,或者稍微调整一下,就可以得到第一种数组。
工作是在方法中,比如toarray,它创建了一个密集数组。稀疏矩阵如何Map到该数组应该是显而易见的,尽管代码细节被隐藏了。从我看到的一些错误来看,我认为它实际上是这样的:M.tocsr().toarray()csr实现了大多数稀疏数学运算以及索引。coo是一种基本格式,在最初创建矩阵时最有用。

相关问题