如何将numpy.matrix或数组转换为scipy稀疏矩阵

时间:2011-10-27 21:14:09

标签: python numpy scipy sparse-matrix

对于SciPy稀疏矩阵,可以使用todense()toarray()转换为NumPy矩阵或数组。反向的功能是什么?

我搜索过,但不知道哪些关键字应该是正确的匹配。

4 个答案:

答案 0 :(得分:98)

初始化稀疏矩阵时,可以将numpy数组或矩阵作为参数传递。例如,对于CSR矩阵,您可以执行以下操作。

>>> import numpy as np
>>> from scipy import sparse
>>> A = np.array([[1,2,0],[0,0,3],[1,0,4]])
>>> B = np.matrix([[1,2,0],[0,0,3],[1,0,4]])

>>> A
array([[1, 2, 0],
       [0, 0, 3],
       [1, 0, 4]])

>>> sA = sparse.csr_matrix(A)   # Here's the initialization of the sparse matrix.
>>> sB = sparse.csr_matrix(B)

>>> sA
<3x3 sparse matrix of type '<type 'numpy.int32'>'
        with 5 stored elements in Compressed Sparse Row format>

>>> print sA
  (0, 0)        1
  (0, 1)        2
  (1, 2)        3
  (2, 0)        1
  (2, 2)        4

答案 1 :(得分:20)

scipy中有几个稀疏矩阵类。

  

bsr_matrix(arg1 [,shape,dtype,copy,blocksize])块稀疏行矩阵
  coo_matrix(arg1 [,shape,dtype,copy])COOrdinate格式的稀疏矩阵。
  csc_matrix(arg1 [,shape,dtype,copy])压缩稀疏列矩阵
  csr_matrix(arg1 [,shape,dtype,copy])压缩的稀疏行矩阵
  dia_matrix(arg1 [,shape,dtype,copy])具有DIAgonal存储的稀疏矩阵
  dok_matrix(arg1 [,shape,dtype,copy])基于稀疏矩阵的密钥字典   lil_matrix(arg1 [,shape,dtype,copy])基于行的链表稀疏矩阵

他们中的任何一个都可以进行转换。

import numpy as np
from scipy import sparse
a=np.array([[1,0,1],[0,0,1]])
b=sparse.csr_matrix(a)
print(b)

(0, 0)  1
(0, 2)  1
(1, 2)  1

请参阅http://docs.scipy.org/doc/scipy/reference/sparse.html#usage-information

答案 2 :(得分:0)

至于反函数,函数是inv(A),但我不推荐使用它,因为对于巨大的矩阵,它的计算成本非常高且不稳定。相反,你应该使用逆的近似值,或者如果你想解决Ax = b,你真的不需要A -1

答案 3 :(得分:0)

在Python中, Scipy库可用于将二维NumPy矩阵转换为稀疏矩阵。用于数字数据的SciPy二维稀疏矩阵包是 scipy.sparse

scipy.sparse包提供了不同的类,以根据二维矩阵创建稀疏矩阵的以下类型

  1. 块稀疏行矩阵
  2. COOrdinate格式的稀疏矩阵。
  3. 压缩的稀疏列矩阵
  4. 压缩的稀疏行矩阵
  5. 具有对角线存储的稀疏矩阵
  6. 基于键字典的稀疏矩阵。
  7. 基于行的列表稀疏矩阵列表
  8. 此类为所有稀疏矩阵提供了基类。

CSR (压缩稀疏行)或 CSC (压缩稀疏列)格式支持有效的访问和矩阵运算。

使用Scipy类将Numpy矩阵转换为压缩稀疏列(CSC)矩阵和压缩稀疏行(CSR)矩阵的示例代码:

import sys                 # Return the size of an object in bytes
import numpy as np         # To create 2 dimentional matrix
from scipy.sparse import csr_matrix, csc_matrix 
# csr_matrix: used to create compressed sparse row matrix from Matrix
# csc_matrix: used to create compressed sparse column matrix from Matrix

创建二维Numpy矩阵

A = np.array([[1, 0, 0, 0, 0, 0],\
              [0, 0, 2, 0, 0, 1],\
              [0, 0, 0, 2, 0, 0]])
print("Dense matrix representation: \n", A)
print("Memory utilised (bytes): ", sys.getsizeof(A))
print("Type of the object", type(A))

打印矩阵和其他详细信息:

Dense matrix representation: 
 [[1 0 0 0 0 0]
 [0 0 2 0 0 1]
 [0 0 0 2 0 0]]
Memory utilised (bytes):  184
Type of the object <class 'numpy.ndarray'>

使用csr_matrix类将矩阵A转换为压缩的稀疏行矩阵表示形式:

S = csr_matrix(A)
print("Sparse 'row' matrix: \n",S)
print("Memory utilised (bytes): ", sys.getsizeof(S))
print("Type of the object", type(S))

打印语句的输出:

Sparse 'row' matrix:
(0, 0) 1
(1, 2) 2
(1, 5) 1
(2, 3) 2
Memory utilised (bytes): 56
Type of the object: <class 'scipy.sparse.csr.csc_matrix'>

使用csc_matrix类将矩阵A转换为压缩稀疏列矩阵表示形式:

S = csc_matrix(A)
print("Sparse 'column' matrix: \n",S)
print("Memory utilised (bytes): ", sys.getsizeof(S))
print("Type of the object", type(S))

打印语句的输出:

Sparse 'column' matrix:
(0, 0) 1
(1, 2) 2
(2, 3) 2
(1, 5) 1
Memory utilised (bytes): 56
Type of the object: <class 'scipy.sparse.csc.csc_matrix'>

可以看出,压缩矩阵的大小为56个字节,原始矩阵的大小为184个字节。

有关更详细的解释和代码示例,请参阅本文:https://limitlessdatascience.wordpress.com/2020/11/26/sparse-matrix-in-machine-learning/