python 稀疏矩阵
稀疏矩阵介绍
稀疏矩阵是指矩阵中除了少量的非零元素,其余都是零的矩阵。
稀疏矩阵一般的维度都比较大,如果直接用二维矩阵来表示的话,会造成内存溢出,或者计算缓慢的缺点。一般将稀疏矩阵进行压缩,将矩阵中的非0元素进行存储在一维向量中,并用位置偏移向量来说明非零元素的相对位置。这样既不会造成内存浪费,而且提高了计算效率。
常见的,在特征工程中,进行one-hot编码时会产生稀疏矩阵,因此需要对稀疏矩阵有所了解。
python的Scipy.sparse模块提供了许多来自于稀疏矩阵的不同存储格式。这里仅描述最为重要的格式CSR、CSC和LIL。CSR、CSC是用于矩阵-矩阵和矩阵-向量运算的有效格式,LIL格式用于生成和更改稀疏矩阵。Python不能自动创建稀疏矩阵,所以要用scipy中特殊的命令来得到稀疏矩阵。
csr矩阵介绍:
压缩稀疏行(CSR,Compressed Sparse Row):或csr_matrix 按行对矩阵进行压缩的。
CSR使用了三个数组,分别为数值、行偏移(表示某一行的第一个元素在数值里面的起始偏移位置,在行偏移的最后补上矩阵总的元素个数)、列号。CSR是一种编码的方式
**一维数组data(数值)*有序地存储了所有的非零值。
一维数组indptr(行偏移量):非量元素的行索引index
一维数组Indices(列号:): 非零元素的列索引index
代码1:如何创建稀疏矩阵?
from pandas import SparseDataFrame
from scipy.sparse import csr_matrix
import numpy as np
if __name__ == '__main__':
row = np.array([0, 0, 1, 2, 2, 2])
col = np.array([0, 2, 2, 0, 1, 2])
data = np.array([1, 2, 3, 4, 5, 6])
a = csr_matrix((data, (row, col)), shape=(3, 3)).toarray()
print(a)
----------------------result-------------------
[[1 0 2]
[0 0 3]
[4 5 6]]
代码2:如何将稀疏矩阵转化为稠密矩阵?
import numpy as np
from sklearn.preprocessing import OneHotEncoder
province_ids_1 = np.array([["Henan","Hebei","Yunnan","Hunan"]])
province_ids_2 = np.array([["Shanghai","Beijing","Shandong","Gunagxi"]])
province_ids = np.concatenate((province_ids_1, province_ids_2), axis = 1) #行拼接
province_ids = province_ids.reshape(-1,1)
province_ids_enc = OneHotEncoder(categories='auto', handle_unknown='ignore')
province_ids_enc.fit(province_ids)
train_arr = [["Henan"], ["Hebei"], ["Beijing"], ["Guangxi"]]
print(province_ids_enc)
train_rs = province_ids_enc.transform(train_arr)
print(train_rs)
print(type(train_rs))
print("*"*30)
train_rs = province_ids_enc.transform(train_arr).toarray()
print(train_rs)
print(type(train_rs))
------------------------result-------------------------------
OneHotEncoder(categories='auto', drop=None, dtype=,
handle_unknown='ignore', sparse=True)
(0, 3) 1.0
(1, 2) 1.0
(2, 0) 1.0
******************************
[[0. 0. 0. 1. 0. 0. 0. 0.]
[0. 0. 1. 0. 0. 0. 0. 0.]
[1. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0.]]