深度学习的矩阵计算

切片slice

在NumPy中,切片(slicing)是一种选择数组元素子集的方法。切片操作基于索引,但允许你指定一个范围的索引,而不是单个索引。这对于处理多维数组(NumPy中的ndarray对象)特别有用。

一维数组切片

假设你有一个一维NumPy数组arr,你可以使用冒号:来指定切片的开始和结束索引(切片是左闭右开的,即包括开始索引但不包括结束索引)。

python 复制代码
import numpy as np  
  
arr = np.array([1, 2, 3, 4, 5])  
print(arr[1:4])  # 输出: [2 3 4]

在这个例子中,arr[1:4]选择了从索引1开始到索引4(不包括索引4)的元素。

多维数组切片

对于多维数组,你可以在每个维度上分别指定切片。

python 复制代码
arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])  
  
# 选择第二行的所有元素  
print(arr_2d[1, :])  # 输出: [4 5 6]  
  
# 选择所有行的前两列  
print(arr_2d[:, :2])  # 输出:  
# [[1 2]  
#  [4 5]  
#  [7 8]]  
  
# 选择第一行和第二行的前两列  
print(arr_2d[0:2, :2])  # 输出:  
# [[1 2]  
#  [4 5]]

使用省略号(...

在NumPy中,省略号(...)用于表示选择所有前面的维度,这在处理多维数组时非常有用,特别是当你想要对数组的一部分进行切片,但保留前面的维度不变时。

然而,需要注意的是,在NumPy中直接使用...进行切片的情况相对较少,因为它主要用于函数和方法的参数中,以指示"所有前面的维度"。但在某些情况下,你可以结合使用索引和省略号来实现特定的切片操作。不过,对于简单的切片任务,直接使用索引和冒号:就足够了。

示例:省略号的使用

假设你有一个三维数组,并想要选择所有第一维和第二维的元素,但只选择第三维的特定切片。

python 复制代码
import torch

a = torch.Tensor([[
    [1, 2, 3, 4, 67],
    [4, 5, 6, 7, 45],
    [7, 8, 9, 10, 56]
], [
    [11, 2, 3, 4, 47],
    [41, 5, 6, 7, 46],
    [71, 8, 9, 10, 36]
]])
print(a.shape)  # torch.Size([2, 3, 5])
c = a[..., 4]
print(c, c.shape)
# tensor([[67., 45., 56.],
#         [47., 46., 36.]]) torch.Size([2, 3])
d = a[1, ...]
print(d, d.shape)
# tensor([[11.,  2.,  3.,  4., 47.],
#         [41.,  5.,  6.,  7., 46.],
#         [71.,  8.,  9., 10., 36.]]) torch.Size([3, 5])

c = a..., 4 表示保留前面所有维度,最后一个维度取第5个元素

d = a1, ... 表示第一个维度取第二个元素,保留后面的所有维度

双索引(高级索引)

在 NumPy 中,使用双索引(或称为高级索引)probs[[0,1],[0,2]] 的方式会从二维数组 probs 中选择特定的元素。具体来说,这种索引方式会按照第一个索引列表 [0,1] 中的索引来选择行,同时按照第二个索引列表 [0,2] 中的索引来选择列。

假设 probs 是如下定义的二维数组:

python 复制代码
import numpy as np  
  
probs = np.array([[0.6590012, 0.242433, 0.0985659],  
                  [0.32278368, 0.14503606, 0.5321803]])

那么,probs[[0,1],[0,2]] 的结果将会是:

  • 从第一行(索引为 0)选择第一列(索引为 0)的元素,即 0.6590012
  • 从第二行(索引为 1)选择第三列(索引为 2)的元素,即 0.5321803

因此,probs[[0,1],[0,2]] 的输出是:

0.6590012 0.5321803

这是一个一维数组,包含了按照指定索引从 probs 中选择的两个元素。

相关推荐
运维行者_2 小时前
Applications Manager中的Redis监控
大数据·服务器·数据库·人工智能·网络协议
吃好睡好便好2 小时前
提取矩阵某一行或某一列元素
开发语言·人工智能·线性代数·算法·matlab·矩阵
AI数字化笔记4 小时前
【无标题】
人工智能
悦数图数据库4 小时前
图数据库选型指南 2026:从架构、性能、AI 适配三个维度看 悦数科技
数据库·人工智能·架构
北京耐用通信5 小时前
自动化工程师必修课:耐达讯自动化Modbus TCP转PROFIBUS协议转换的核心逻辑与应用
人工智能·物联网·网络协议·自动化·信息与通信
无忧智库5 小时前
某AI漫剧超级工厂AI绘画与分镜自动化生成流水线详细设计方案(WORD)
人工智能·ai作画·自动化
火山引擎开发者社区5 小时前
ArkClaw 全新升级,从 UI 到 Agent 协作全面进化
人工智能
Mininglamp_27185 小时前
会中 AI Skill 架构设计解析:3 种人设 × 7 种能力的技术实现
人工智能·语音识别·硬件·ai agent·skill
墨神谕5 小时前
人工智能(三)— 神经网络的训练
人工智能·神经网络·机器学习
RyFit6 小时前
Java + AI 实战:Spring AI 从入门到企业级落地
java·人工智能·spring