COOTensor 是 MindSpore 中用于表示稀疏张量的一种核心数据结构。它采用“坐标格式”(COO, Coordinate Format)来高效存储和处理主要包含零元素的矩阵(或高维张量),其核心思想是只记录非零元素的位置和值。
一、 核心概念与创建
一个 COOTensor 由三个关键部分构成:
- **
indices(索引)**:一个二维整数张量,形状为(N, ndims)。其中N代表非零元素的个数,ndims代表稀疏张量的维度。目前文档指出ndims仅支持为 2。indices[i]表示第i个非零元素的坐标。 - **
values(值)**:一个一维张量,形状为(N,),存储了indices中每个位置对应的非零数值。 - **
shape(形状)**:一个整数元组,指定了对应的稠密张量的形状。
创建方式主要通过 mindspore.COOTensor构造函数:
- 方式一:直接提供
indices,values,shape三个参数。 - 方式二:通过另一个
coo_tensor对象来初始化。
示例:以下代码创建了一个 3x4 的稠密张量对应的 COOTensor,其中位置 (0,1) 值为1,位置 (1,2) 值为2。
import mindspore as ms
from mindspore import Tensor, COOTensor
indices = Tensor([[0, 1], [1, 2]], dtype=ms.int32)
values = Tensor([1, 2], dtype=ms.float32)
shape = (3, 4)
x = COOTensor(indices, values, shape)
其对应的稠密张量为:
[[0, 1, 0, 0],
[0, 0, 2, 0],
[0, 0, 0, 0]]
二、 主要属性与方法
COOTensor 提供了一系列用于查询、转换和运算的属性和方法。
1. 关键属性:
indices,values,shape:获取构成该稀疏张量的三个核心组件。dtype:返回非零元素值的数据类型。ndim:返回稀疏矩阵的稠密维度(即shape的长度)。size:返回非零元素的数量(即values的长度)。itemsize:返回每个非零元素值所占的字节数。
2. 格式转换方法:
to_dense():将 COOTensor 转换为普通的稠密 Tensor(仅在 GPU 平台支持)。to_csr():将 COOTensor 转换为另一种稀疏格式 CSRTensor(支持 GPU/CPU)。to_tuple():将indices,values,shape作为一个元组返回。astype(dtype):返回指定新数据类型的 COOTensor。
3. 运算与处理:
- 算术运算:支持基本的加(
+)、减(-)、乘(*)、除(/)等逐元素运算。 abs():对所有非零元素取绝对值,返回新的 COOTensor。add(other, thresh):与另一个 COOTensor 相加。thresh参数是一个阈值张量,用于决定结果中 indices/values 对是否保留(当结果值小于阈值时被丢弃)。此方法对indices和values的数据类型有严格校验。coalesce():合并 COOTensor 中相同索引的值(仅在 GPU 平台支持)。这是处理可能包含重复索引的 COOTensor 的重要操作。