numpy 稀疏矩阵

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.]]

你可能感兴趣的:(python基础)