【pytorch】pytorch中的高级索引

这里只介绍pytorch的高级索引,是一些奇怪的切片索引

基本版

a\[0, 2, 1, 2] 等价 a0, 1 和 a2, 2,相当于索引张量的第一行的第二列和第三行的第三列元素;

a\[1, 0, 2, 0] 等价 a1, 0 和 a0, 0 和 a2, 0,相当于索引张量的第二行第一列的元素、张量第一行和第一列的元素以及张量第三行和第一列的元素

python 复制代码
import torch
a = torch.arange(9).view([3, 3])

print(a)
b = a[[0, 2], [1, 2]]

print(b)

c = a[[1, 0, 2], [0]]

print(c)


# ---------output----------
# tensor([[0, 1, 2],
#         [3, 4, 5],
#         [6, 7, 8]])
# tensor([1, 8])
# tensor([3, 0, 6])

# 这里参考了:https://zhuanlan.zhihu.com/p/509591863

高级索引的原则:索引中有: 就代表着改维度全部取,在哪个维度放置索引,就代表想取哪个维度的内容

扩展A:

python 复制代码
import torch
a = torch.arange(30).view([2, 5, 3])  # 假如a代表N, x, y
print(a)

b = torch.tensor([[0, 2],
                  [1, 2]])
print(a[:, b[0, :], :])

# ------output-------
# tensor([[[ 0,  1,  2],
#          [ 3,  4,  5],
#          [ 6,  7,  8],
#          [ 9, 10, 11],
#          [12, 13, 14]],
#
#         [[15, 16, 17],
#          [18, 19, 20],
#          [21, 22, 23],
#          [24, 25, 26],
#          [27, 28, 29]]])
# tensor([[[ 0,  1,  2],
#          [ 6,  7,  8]],
#
#         [[15, 16, 17],
#          [21, 22, 23]]])

# 上述代码含义是对a的所有N, 按b中的第一行取出所有的行

扩展B:

python 复制代码
a = torch.arange(30).view([2, 5, 3])
print(a)

b = torch.tensor([[0, 2],
                  [1, 2]])
print(a[:, b[:, 0], b[:, 1]])

# ----------output--------------
# tensor([[[ 0,  1,  2],
#          [ 3,  4,  5],
#          [ 6,  7,  8],
#          [ 9, 10, 11],
#          [12, 13, 14]],
# 
#         [[15, 16, 17],
#          [18, 19, 20],
#          [21, 22, 23],
#          [24, 25, 26],
#          [27, 28, 29]]])
# tensor([[ 2,  5],
#         [17, 20]])

# 上述代码含义是对a的所有batch, 按b中的元素取出a中的x, y; 取N次

扩展C: (最抽象的一次)

python 复制代码
a = torch.arange(30).view([2, 5, 3])
print(a)

b = torch.tensor([[0, 2],
                  [1, 2]])
print(a[:, b, :])

# ------output-------
# tensor([[[ 0,  1,  2],
#          [ 3,  4,  5],
#          [ 6,  7,  8],
#          [ 9, 10, 11],
#          [12, 13, 14]],
# 
#         [[15, 16, 17],
#          [18, 19, 20],
#          [21, 22, 23],
#          [24, 25, 26],
#          [27, 28, 29]]])
# tensor([[[[ 0,  1,  2],
#           [ 6,  7,  8]],
# 
#          [[ 3,  4,  5],
#           [ 6,  7,  8]]],
# 
# 
#         [[[15, 16, 17],
#           [21, 22, 23]],
# 
#          [[18, 19, 20],
#           [21, 22, 23]]]])

# 上述代码含义是对a的所有batch, 按b中的元素取出a中行; 取N * b[0]次

torch.gather函数

本来想使用torch.gather函数完成上述功能,实验后发现并不直观,还是用高级索引吧。这里放个torch.gather函数单独的内容吧。

python 复制代码
import torch

tensor_0 = torch.arange(3, 12).view(3, 3)
print(tensor_0)

index = torch.tensor([[2, 1, 0]])
tensor_1 = tensor_0.gather(0, index)
print(tensor_1)


index = torch.tensor([[2, 1, 0]])
tensor_1 = tensor_0.gather(1, index)
print(tensor_1)

#-------------output------------
# tensor([[ 3,  4,  5],
#         [ 6,  7,  8],
#         [ 9, 10, 11]])
# tensor([[9, 7, 5]])
# tensor([[5, 4, 3]])

# torch.gather的理解
# index=[ [x1,x2,x2],
# [y1,y2,y2],
# [z1,z2,z3] ]
# 
# 如果dim=0
# 填入方式
# [ [(x1,0),(x2,1),(x3,2)]
# [(y1,0),(y2,1),(y3,2)]
# [(z1,0),(z2,1),(z3,2)] ]
#
# 如果dim=1
# [ [(0,x1),(0,x2),(0,x3)]
# [(1,y1),(1,y2),(1,y3)]
# [(2,z1),(2,z2),(2,z3)] ]

# 参考: https://zhuanlan.zhihu.com/p/352877584
相关推荐
程序员脚趾17 小时前
GPT-5.6 上线:当 GPT 与 Codex 走向融合,AI 正从“回答问题”走向“完成工作”
人工智能
thubier(段新建)17 小时前
owtb 3pl 面向城市配送物流企业需求V0.2
大数据·人工智能
Token炼金师17 小时前
模型的防线:Prompt 注入防御、越狱攻击与对齐、红队测试、价值观对齐、对抗样本鲁棒性、安全评测与边界 —— 模型安全六防
人工智能·红队测试·prompt 注入防御·越狱攻击与对齐·价值观对齐·对抗样本鲁棒性·安全评测与边界
嘘神秘用18 小时前
布:AI 驱动的 Redis 客户端,更快、更直观
数据库·人工智能·redis
黒亱中旳18 小时前
Java AI 框架三国杀:Solon AI vs Spring AI vs LangChain4j 深度对比
java·人工智能·spring
小和尚同志18 小时前
前端 AI 单元测试思考与落地
前端·人工智能·aigc
alxraves18 小时前
医用超声远程会诊系统:会诊平台的核心架构与功能解析
java·人工智能·架构
jinggongszh19 小时前
智能硬件对接与系统落地:开发岗在制造现场的经验沉淀
大数据·人工智能
ZeekerLin19 小时前
AI 原生团队协作机制:角色、分工与工程文化变化
大数据·人工智能
我是坏垠19 小时前
Crypto、Cipher与Password:Java加密开发的三个核心概念
java·开发语言·python