"""
案例：
    演示 张量的索引操作
涉及到的API:
    简单行列索引
    列表索引
    范围索引
    多维索引
    布尔索引
需要掌握的：
    简单行列索引 t1[0,0], t1[0]
    范围索引 t1[:2], t1[:2,2:4], 起始(默认0):结束(默认最后):步长(默认1)

"""

# 导包
import torch

# 1.定义函数，演示 张量的索引操作
def demo01():
    # 0.设置随机种子
    torch.manual_seed(5)
    # 1.定义一个张量，(3,4)
    t1 = torch.randint(0,10,(3,4))
    print(f"t1:\n{t1}, shape: {t1.shape}, dtype: {t1.dtype}")
    # 2.演示 简单行列索引
    # print(f"t1[0,0]: {t1[0,0]}, ndim: {t1[0,0].ndim},shape: {t1[0,0].shape}")
    # print(f"t1[1]: {t1[1]},ndim: {t1[1].ndim},shape: {t1[1].shape}")
    # print(f"t1[:,2]: {t1[:,2]},ndim: {t1[:,2].ndim},shape: {t1[:,2].shape}")
    # 3.演示 列表索引
    # # 获取(0,1),(1,2)位置的元素
    # print(f"t1[[0,1],[1,2]]: {t1[[0,1],[1,2]]}, ndim: {t1[[0,1],[1,2]].ndim},shape: {t1[[0,1],[1,2]].shape}")
    # # 获取(0,2),(1,3)位置的元素
    # print(f"t1[[0,1],[2,3]]: {t1[[0,1],[2,3]]}, ndim: {t1[[0,1],[2,3]].ndim},shape: {t1[[0,1],[2,3]].shape}")
    # 4.演示 范围索引
    # # 获取前两行
    # print(f"t1[:2]: {t1[:2]}, ndim: {t1[:2].ndim},shape: {t1[:2].shape}")
    # # 获取前两列
    # print(f"t1[:,:2]: {t1[:,:2]}, ndim: {t1[:,:2].ndim},shape: {t1[:,:2].shape}")
    # # 获取偶数行
    # t2 = t1[1::2]
    # print(f"t2: {t2}, ndim: {t2.ndim},shape: {t2.shape}")
    # # 获取偶数行的奇数列
    # t3 = t1[1::2,::2]
    # print(f"t3: {t3}, ndim: {t3.ndim},shape: {t3.shape}")
    # 5.演示 多维索引
    t4 = torch.randint(0,10,(3,4,5))
    print(f"t4:\n{t4}, shape: {t4.shape}, dtype: {t4.dtype}")
    # # 获取(0,0,0)位置的元素
    # t5 = t4[0,0,0]
    # print(f"t5: {t5}, ndim: {t5.ndim},shape: {t5.shape}")
    # # 获取0轴索引1，1轴偶数索引，2轴前3个 的数据
    # t6 = t4[1,::2,:3]   # (2,3)
    # print(f"t6: {t6}, ndim: {t6.ndim},shape: {t6.shape}")
    # 6.演示 布尔索引
    # 获取第二行的大于5的所有元素
    print(t4[1]>5)  # (3,5)
    t5 = t4[1,t4[1]>5]
    print(f"t5: {t5}, ndim: {t5.ndim},shape: {t5.shape}")
    ...

# 测试
if __name__ == '__main__':
    demo01()
