slice

paddle.sparse.slice(x, axis, starts, ends, name=None):

沿多个轴生成 x 的切片。使用 axesstartsends 属性来指定轴列表中每个轴的起点和终点位置,并使用此信息来对 x 切片。 如果向 startsends 传递负值如 \(-i\),则表示该轴的反向第 \(i-1\) 个位置(这里以 0 为初始位置)。 如果传递给 startsend 的值大于 n (维度中的元素数目),则表示 n。 当切片一个未知数量的维度时,建议传入 INT_MAXaxesstartsends 三个参数的元素数目必须相等。

以下示例将解释切片如何工作 (此处只介绍 Slice 的概念, 故不区分稀疏和稠密 Tensor):

示例 1:
        给定:
             data=[[1,2,3,4],[5,6,7,8],]
             axes=[0,1]
             starts=[1,0]
             ends=[2,3]
        则:
             result=[[5,6,7],]

示例 2:
        给定:
             data=[[1,2,3,4],[5,6,7,8],]
             starts=[0,1]
             ends=[-1,1000]    # 此处-1 表示第 0 维的反向第 0 个位置,索引值是 1。
        则:
             result=[[2,3,4],] # 即 data[0:1, 1:4]

参数

  • x (Tensor) - 输入的多维 Tensor,数据类型为 bool、float16、float32、float64、int32 或 int64。

  • axis (list|tuple|Tensor) - 数据类型是 int32。如果 axes 的类型是 list 或 tuple, 它的元素可以是整数或者形状为[1]的 Tensor。如果 axes 的类型是 Tensor,则是 1-D Tensor。表示进行切片的轴。

  • starts (list|tuple|Tensor) - 数据类型是 int32。如果 starts 的类型是 list 或 tuple, 它的元素可以是整数或者形状为[1]的 Tensor。如果 starts 的类型是 Tensor,则是 1-D Tensor。表示在各个轴上切片的起始索引值。

  • ends (list|tuple|Tensor) - 数据类型是 int32。如果 ends 的类型是 list 或 tuple, 它的元素可以是整数或者形状为[1]的 Tensor。如果 ends 的类型是 Tensor,则是 1-D Tensor。表示在各个轴上切片的结束索引值。

返回

多维 Tensor,数据类型与 x 相同。

代码示例

import paddle
import numpy as np

format = 'coo'
np_x = np.asarray([[4, 0, 7, 0], [0, 0, 5, 0], [-4, 2, 0, 0]])
dense_x = paddle.to_tensor(np_x)
if format == 'coo':
    sp_x = dense_x.to_sparse_coo(len(np_x.shape))
else:
    sp_x = dense_x.to_sparse_csr()

axes = [0, 1]
starts = [1, 0]
ends = [3, -2]
sp_out = paddle.sparse.slice(sp_x, axes, starts, ends)
# sp_out is x[1:3, 0:-2]

print(sp_out)
# Tensor(shape=[2, 2], dtype=paddle.int64, place=Place(cpu), stop_gradient=True,
#        indices=[[1, 1],
#                 [0, 1]],
#        values=[-4,  2])