深度学习的矩阵计算

 切片slice

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

一维数组切片

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

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)的元素。

多维数组切片

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

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

示例:省略号的使用

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

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 = a[1, ...] 表示第一个维度取第二个元素,保留后面的所有维度

双索引(高级索引)

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

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

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 中选择的两个元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值