目录

第1部分 稀疏矩阵概述

1.1 概述

1.2 COO矩阵的原理

第2部分 稀疏矩阵创建的代码示例

2.1 环境准备

2.2 COO矩阵

2.3 目标稀疏矩阵

参考:


第1部分 稀疏矩阵概述

1.1 概述

稀疏矩阵指矩阵中的大多数元素的值都为0,由于其中非常多的元素都是0,使用常规方法进行存储非常的浪费空间,所以采用另外的方法存储稀疏矩阵。

 

1.2 COO矩阵的原理

Coordinate(COO)格式是用来描述稀疏矩阵一种方法或数据结构。

Coordinate(COO)格式本身是一个矩阵,用COO矩阵,描述另一个目标稀疏矩阵,原理如下:

[PyTroch系列-5]:PyTorch基础 - 稀疏矩阵与其创建方法_.net

这是非常简单的一种方式,使用一个三元组构成的三维COO矩阵来描述任意维度的稀疏矩阵。

三元组分别表示稀疏矩阵中的元素(所在行,所在列,元素值)。

如上图目标矩阵,一共有4*4的目标矩阵,共16个元素,其中4个非零元素:

(0, 0) 位置的值是1。

(0,1) 位置的值是7

(1,1) 位置的值是2

(1,2) 位置的值是8

因此需要3 * 4的COO矩阵,来描述一个4*4的稀疏矩阵。

很显然,通过上述方法,目标稀疏矩阵的每个位置,需要通过3个数组来表示,增加了存储空间。

因此当矩阵规模比较小时,上述的表示是浪费存储空间的。

只有当矩阵的规模比较大,且是稀疏矩阵时,上述的表示才体现出优势。

 

第2部分 稀疏矩阵创建的代码示例

2.1 环境准备

import numpy as np
import torch

print("Hello World")
print(torch.__version__)
print(torch.cuda.is_available())

 

2.2 COO矩阵

indices = torch.tensor([[0, 0, 1, 1], [0, 1, 1, 2]])
values = torch.tensor([1, 7, 2, 8], dtype=torch.float32)
a = torch.sparse_coo_tensor(indices=indices, values=values, size=[4, 4])

print(a)

print(a.device)
print(a.layout)
print(a.dtype)       #tensor的数据类型
print(a.type)        #tensor本身的类型
print(a.type())      #tensor的数据类型
print(a.size())
print(a.shape)      #tensor的维度
输出:

tensor(indices=tensor([[0, 0, 1, 1],
                       [0, 1, 1, 2]]),
       values=tensor([1., 7., 2., 8.]),
       size=(4, 4), nnz=4, layout=torch.sparse_coo)
cpu
torch.sparse_coo
torch.float32
<built-in method type of Tensor object at 0x000002655E57B980>
torch.sparse.FloatTensor
torch.Size([4, 4])
torch.Size([4, 4])

2.3 目标稀疏矩阵

b = a.to_dense()  #把COO矩阵转换成稀疏矩阵

print(b)

print(a.device)
print(a.layout)
print(a.dtype)       #tensor的数据类型
print(a.type)        #tensor本身的类型
print(a.type())      #tensor的数据类型
print(a.size())
print(a.shape)      #tensor的维度

输出:

tensor([[1., 7., 0., 0.],
        [0., 2., 8., 0.],
        [0., 0., 0., 0.],
        [0., 0., 0., 0.]])
cpu
torch.sparse_coo
torch.float32
<built-in method type of Tensor object at 0x000002655E57B980>
torch.sparse.FloatTensor
torch.Size([4, 4])
torch.Size([4, 4])