NumPy是Python生态中经典的数值计算库,PyTorch则是深度学习领域主流的框架,二者都支持张量数据结构,但张量索引的设计逻辑存在明显不同,了解这些差异能帮助开发者更顺畅地在两个工具间切换。

基础索引与切片差异
基础索引和切片是最常用的操作,二者在单元素索引上逻辑一致,但在切片返回结果的属性上有区别。
单元素索引
二者的单元素索引都使用方括号加索引值的方式,索引从0开始计数,示例如下:
import numpy as np import torch # NumPy单元素索引 np_arr = np.array([1, 2, 3, 4]) print(np_arr[0]) # 输出1 # PyTorch单元素索引 torch_tensor = torch.tensor([1, 2, 3, 4]) print(torch_tensor[0]) # 输出tensor(1)
切片操作差异
NumPy切片返回的是原数组的视图,修改切片内容会影响原数组;PyTorch切片返回的是新的张量对象,修改切片不会影响原张量,除非使用原地操作。
import numpy as np import torch # NumPy切片修改影响原数组 np_arr = np.array([1, 2, 3, 4]) np_slice = np_arr[1:3] np_slice[0] = 10 print(np_arr) # 输出[ 1 10 3 4] # PyTorch切片修改不影响原张量 torch_tensor = torch.tensor([1, 2, 3, 4]) torch_slice = torch_tensor[1:3] torch_slice[0] = 10 print(torch_tensor) # 输出tensor([1, 2, 3, 4]) # 原地操作才会影响原张量 torch_tensor[1:3] = 10 print(torch_tensor) # 输出tensor([ 1, 10, 10, 4])
高级索引差异
高级索引指使用整数数组或张量作为索引,二者在返回结果的维度和内存特性上有区别。
整数数组索引
NumPy的高级索引返回的是原数组的副本,PyTorch的高级索引返回的是新的张量,同时二者在索引维度的处理上逻辑一致。
import numpy as np import torch # NumPy整数数组索引 np_arr = np.array([[1, 2], [3, 4], [5, 6]]) np_idx = np.array([0, 2]) print(np_arr[np_idx]) # 输出[[1 2] [5 6]] # PyTorch整数张量索引 torch_tensor = torch.tensor([[1, 2], [3, 4], [5, 6]]) torch_idx = torch.tensor([0, 2]) print(torch_tensor[torch_idx]) # 输出tensor([[1, 2], [5, 6]])
布尔索引差异
布尔索引通过布尔条件筛选元素,二者在返回结果的形状和赋值规则上有不同。
布尔筛选结果
NumPy布尔索引返回的是一维数组,包含所有满足条件的元素;PyTorch布尔索引返回的是一维张量,和NumPy逻辑一致,但赋值时PyTorch支持广播规则,NumPy则需要保证形状匹配。
import numpy as np import torch # NumPy布尔索引 np_arr = np.array([1, 2, 3, 4, 5]) np_mask = np_arr > 3 print(np_arr[np_mask]) # 输出[4 5] # NumPy赋值需要形状匹配 np_arr[np_mask] = 0 print(np_arr) # 输出[1 2 3 0 0] # PyTorch布尔索引 torch_tensor = torch.tensor([1, 2, 3, 4, 5]) torch_mask = torch_tensor > 3 print(torch_tensor[torch_mask]) # 输出tensor([4, 5]) # PyTorch支持广播赋值 torch_tensor[torch_mask] = 0 print(torch_tensor) # 输出tensor([1, 2, 3, 0, 0])
索引赋值规则差异
在给索引位置赋值时,NumPy允许直接给切片或高级索引赋值任意兼容形状的数据,PyTorch则更严格,要求赋值数据的形状要么和索引结果完全一致,要么符合广播规则。
import numpy as np import torch # NumPy赋值兼容形状 np_arr = np.zeros((3, 3)) np_arr[1:3, 1:3] = [[1, 2], [3, 4]] print(np_arr) # 输出 # [[0. 0. 0.] # [0. 1. 2.] # [0. 3. 4.]] # PyTorch赋值需要符合广播规则 torch_tensor = torch.zeros((3, 3)) # 形状完全匹配 torch_tensor[1:3, 1:3] = torch.tensor([[1, 2], [3, 4]]) print(torch_tensor) # 广播赋值 torch_tensor[1:3, 1:3] = 5 print(torch_tensor)
差异总结
二者张量索引的核心差异可以整理为下表:
| 对比维度 | NumPy | PyTorch |
|---|---|---|
| 切片返回属性 | 原数组视图,修改影响原数组 | 新张量对象,普通修改不影响原张量 |
| 高级索引返回属性 | 原数组副本 | 新张量对象 |
| 赋值规则 | 要求赋值数据形状完全匹配 | 支持形状匹配或广播规则 |
| 单元素返回类型 | 标量值 | 标量张量 |
在实际使用中,如果需要操作深度学习模型中的张量,优先使用PyTorch的索引规则,避免因为切片视图特性导致梯度计算错误;如果是纯数值计算场景,NumPy的索引逻辑更高效,适合处理大规模数值数据。
NumPyPyTorch张量索引tensor_indexing修改时间:2026-06-24 17:06:33