索引和切片(上)

本文介绍了如何使用NumPy进行一维和二维数组的索引操作,包括基本索引、切片、布尔索引和视图概念,帮助读者理解数组操作的灵活性。通过实例演示了索引修改数组、复制操作和不同维度的复杂索引应用。
  • 普通索引
  • 花式索引
import numpy as np

# 一维数组的创建
arr=np.arange(1,10)  # array([1, 2, 3, 4, 5, 6, 7, 8, 9])

arr[0]  # 1

arr[3:5]  # array([4, 5])

arr[::-1]  # array([9, 8, 7, 6, 5, 4, 3, 2, 1])


arr[-4:-2] # array([6,7])

arr[5]=12
arr  # array([ 1,  2,  3,  4,  5, 12,  7,  8,  9])

arr_change=arr
arr_change[1:3]=[17,19]
arr_change  # array([ 1, 17, 19,  4,  5, 12,  7,  8,  9])
arr  # array([ 1, 17, 19,  4,  5, 12,  7,  8,  9])  # arr_change是传的视图(相当于引用),它改变的,源数据也会跟着改变

arr_change=arr.copy()
arr_change[1:3]=[4,9]  # array([ 1,  4,  9,  4,  5, 12,  7,  8,  9])
arr  # array([ 1, 17, 19,  4,  5, 12,  7,  8,  9])

# 二维数组的创建
data2=[[8.5,6,4.1,2,0.7],[1.5,3,5.4,7,3.9],[3.2,4.5,6,3,9]]
arr2=np.array(data2)
arr2[2]  # [3.2, 4.5, 6, 3, 9]
arr2[2,1]  # 4.5

arr2[:,2:4]  
# array([[4.1, 2. ],
         [5.4, 7. ],
         [6. , 3. ]])

arr2[1:,2:]  
# array([[5.4, 7. , 3.9],
       [6. , 3. , 9. ]])

arr2[arr2>3.5]  #  array([8.5, 6. , 4.1, 5.4, 7. , 3.9, 4.5, 6. , 9. ])

arr2[~(arr2>=3.5)]  #  array([2. , 0.7, 1.5, 3. , 3.2, 3. ])

(arr2>3.5)&(arr2<10)
array([[ True,  True,  True, False, False],
       [False, False,  True,  True,  True],
       [False,  True,  True, False,  True]])

arr2[(arr2>3.5)&(arr2<10)]  #  array([8.5, 6. , 4.1, 5.4, 7. , 3.9, 4.5, 6. , 9. ])


<think>好的,我现在需要帮助用户了解PyTorch中的索引切片使用方法。根据用户提供的引用内容,我需要整理出相关的知识点,并且确保回答结构清晰,符合用户的要求。 首先,我需要回忆PyTorch中的基本索引切片操作。基础部分应该包括类似于Python列表NumPy数组的索引方式,比如使用冒号:来切片,逗号分隔不同维度等等。这部分用户可能已经有一定了解,但作为教程,还是需要简要说明。 然后,用户提到的引用中提到了高级索引,比如使用布尔张量索引张量。这里需要详细说明如何用布尔张量进行条件筛选,例如根据某个条件选择元素。同时,还需要解释索引张量的使用,比如用多个索引值组合来提取特定元素。这部分可能需要举例说明,帮助用户理解不同维度的操作。 接下来,用户的问题中还提到了torch.gather函数,这在引用中的示例代码里有展示。我需要解释torch.gather的用法,包括参数dim的作用,以及输入张量索引张量的形状关系。这里可能需要对比不同dim值的结果差异,如dim=0dim=1时的不同输出,如引用中的例子所示。 另外,引用里提到了torch.hstack,不过用户的问题主要集中在索引切片,所以可能需要简要提及连接操作,但重点还是放在索引切片上。不过根据用户的要求,可能需要保持回答的专注,所以可能暂时不深入讨论连接函数,除非用户特别提到。 然后,根据用户提供的系统级指令,需要生成相关问题。我需要考虑用户可能想进一步了解的内容,比如高级索引的实际应用场景、不同函数的区别(如gatherindex_select)、性能优化等。 在整理回答时,需要确保所有的数学表达式公式使用正确的LaTeX格式,行内公式用$...$,独立公式用$$...$$。例如,在说明张量的形状时,可以用$shape=(2,2)$这样的格式。 还需要注意引用标识的正确添加,比如在提到PyTorch的索引切片时,引用[^1][^2]需要自然地插入到相关段落的末尾。例如,在讨论torch.gather的例子时,可以附上引用[^2]。 可能存在的疑问点:用户是否了解张量的基本概念?是否需要先简要介绍张量?但根据问题中的引用内容,用户似乎已经接触过张量操作,所以可能不需要基础介绍,直接切入索引切片。 另外,需要检查示例代码的正确性,确保用户提供的代码片段在回答中正确引用,比如torch.gather的不同dim值导致的输出差异。例如,当dim=1时,第二个示例的结果是[[1,2],[3,2]],而dim=0时结果可能不同,需要明确说明。 在结构上,按照用户的示例,先分点讲解基础索引、高级索引、torch.gather函数,每个部分给出代码示例,并附上相关引用。最后生成相关问题,如高级索引的应用、函数之间的区别、性能比较等。 最后,确保语言使用中文,避免专业术语错误,保持口语化,但作为教程需要准确无误。例如,解释布尔索引时,可以说明“通过布尔张量选择满足条件的元素”,并给出示例代码。 总结步骤: 1. 介绍基础索引切片,包括基本用法示例。 2. 讲解高级索引,包括布尔索引索引张量,并提供例子。 3. 详细说明torch.gather函数,参数dim的影响,以及示例代码。 4. 添加相关问题,引导用户深入学习。</think>PyTorch的索引切片操作是实现张量数据灵活处理的核心功能,下面通过三个层次进行说明: ### 一、基础索引切片 基础操作遵循Python切片语法,支持跨维度操作: ```python x = torch.tensor([[1,2,3],[4,5,6]]) print(x[0, 1:3]) # 输出第一行第2-3列元素: tensor([2,3]) print(x[:, ::2]) # 输出所有行、间隔2列的切片: tensor([[1,3],[4,6]]) ``` 支持负索引`x[-1]`获取末行数据,空切片`x[:]`实现浅拷贝[^2]。 ### 二、高级索引切片 #### 1. 布尔索引 通过布尔张量筛选元素: ```python mask = x > 3 print(x[mask]) # 输出所有大于3的元素: tensor([4,5,6]) ``` #### 2. 索引张量 使用坐标索引组合获取元素: ```python indices = torch.tensor([[0,1],[1,2]]) print(x[indices]) # 获取(0,1)(1,2)坐标元素: tensor([2,6]) ``` ### 三、特殊索引函数 #### torch.gather 沿指定维度收集数据: ```python # dim=1时横向收集 print(torch.gather(x, 1, torch.tensor([[0,0],[1,0]]))) # 输出: tensor([[1,1],[5,4]]) # dim=0时纵向收集 print(torch.gather(x, 0, torch.tensor([[0,1],[1,0]]))) # 输出: tensor([[1,5],[4,2]]) ``` 输入张量$shape=(n,m)$与索引张量$shape=(k,l)$需满足:当dim=0时$k \leq n$,当dim=1时$l \leq m$[^2]。 #### torch.index_select 按维度选择索引: ```python print(torch.index_select(x, 0, torch.tensor([1]))) # 选择第2行: tensor([[4,5,6]]) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

seraph呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值