Python学习笔记(持续更新)

Numpy

shape函数

.shape:返回矩阵维度。

import numpy as np
x=np.array([[1,2,3],[4,5,6]])
y=np.array([[[1,1,1,1],[2,2,2,2],[3,3,3,3]],[[4,4,4,4],[5,5,5,5],[6,6,6,6]]])
print(x.shape)
print(y.shape)
结果:
(2, 3)
(2, 3, 4)

shape[0]:返回矩阵第一维度。二维矩阵返回了行数,而三维矩阵返回了2代表有2个二维矩阵。

print(x.shape[0])
print(y.shape[0])
结果:
2
2

shape[1]:返回矩阵第二维度。二维矩阵返回了列数,而三维矩阵返回的3代表在这2个二维矩阵中的行数。

print(x.shape[1])
print(y.shape[1])
结果:
3
3

同理可得,三维矩阵还有shape[2],上文创造的三维矩阵的y.shape[2] 为4。

对于图像来说:
image.shape[0]——图片高
image.shape[1]——图片长
image.shape[2]——图片通道数
而对于矩阵来说:
shape[0]:表示矩阵的行数
shape[1]:表示矩阵的列数

shape[-1]:返回矩阵最后的维度。

print(x.shape[-1])
print(y.shape[-1])
结果:
3
4

reshape函数

reshape(-1,)

reshape(-1):改成一串,没有行列

z = np.array([[1, 2, 3, 4],
          [5, 6, 7, 8],
          [9, 10, 11, 12]])

print(z.reshape(-1))
结果:
[ 1  2  3  4  5  6  7  8  9 10 11 12]

reshape(-1,1):1表示最里面的维度为1

print(z.reshape(-1,1))
结果:
[[ 1]
 [ 2]
 [ 3]
 [ 4]
 [ 5]
 [ 6]
 [ 7]
 [ 8]
 [ 9]
 [10]
 [11]
 [12]]

reshape(-1,2):最里面的维度为2

print(z.reshape(-1,2))
结果:
[[ 1  2]
 [ 3  4]
 [ 5  6]
 [ 7  8]
 [ 9 10]
 [11 12]]

reshape(-1,2,3):最里面的维度为(2,3)。可以理解为把原矩阵转换为一个大矩阵里包含着若干个维度为(2,3)的小矩阵

print(z.reshape(-1,2,3))
结果:
[[[ 1  2  3]
  [ 4  5  6]]

 [[ 7  8  9]
  [10 11 12]]]

reshape(-1,2,2,3):最里面的维度为(2,2,3)

print(z.reshape(-1,2,2,3))
结果:
[[[[ 1  2  3]
   [ 4  5  6]]

  [[ 7  8  9]
   [10 11 12]]]]

Pytorch

dim()函数
用法:返回矩阵维度

c = torch.randn(2,3,4,5)
c.dim()
结果:
4

bmm()函数
函数原型:torch.bmm(mat1, mat2),用于执行批量矩阵乘法

参数说明:
mat1 和 mat2 是两个三维张量(或者可以被广播为三维张量)。
mat1 的形状为 (batch, n, m)。
mat2 的形状为 (batch, m, p)。

返回值是一个三维张量,其形状为 (batch, n, p)

mat1 = torch.rand(3, 2, 4)
mat2 = torch.rand(3, 4, 3)
result = torch.bmm(mat1, mat2)
print(result.shape)
结果:
torch.Size([3, 2, 3])

torch.repeat_interleave()

函数原型

torch.repeat_interleave(input, repeats, dim=None) → Tensor

函数功能:沿着指定的维度重复张量的元素

输入参数:

  • input (类型:torch.Tensor):输入张量
  • repeats(类型:int或torch.Tensor):每个元素的重复次数
  • dim(类型:int)需要重复的维度。默认情况下dim=None,表示将把给定的输入张量展平(flatten)为向量,然后将每个元素重复repeats次,并返回重复后的张量。

注意

  • 如果不指定dim,则默认将输入张量扁平化(维数是1,因此这时repeats必须是一个数,不能是数组),并且返回一个扁平化的输出数组。
  • 返回的数组与输入数组维数相同,并且除了给定的维度dim,其他维度大小与输入数组相应维度大小相同
  • repeats:如果传入数组,则必须是tensor格式。并且只能是一维数组,数组长度与输入数组input的dim维度大小相同

例:

import torch
a = torch.randn(3,2)
结果:
tensor([[ 0.0033, -0.3267],
        [-0.8046,  0.5277],
        [-0.1620,  0.8179]])

1、输入二维张量,不指定dim,重复次数为2次,表示将把给定的输入张量展平(flatten)为向量,然后将每个元素重复2次,并返回重复后的张量。

torch.repeat_interleave(a,2)
结果:
tensor([ 0.0033,  0.0033, -0.3267, -0.3267, -0.8046, -0.8046,  0.5277,  0.5277,
        -0.1620, -0.1620,  0.8179,  0.8179])

2、输入二维张量,指定dim=0,重复次数为3次,表示把输入张量每行元素重复3次

torch.repeat_interleave(a,3,dim=0)
结果:
tensor([[ 0.0033, -0.3267],
        [ 0.0033, -0.3267],
        [ 0.0033, -0.3267],
        [-0.8046,  0.5277],
        [-0.8046,  0.5277],
        [-0.8046,  0.5277],
        [-0.1620,  0.8179],
        [-0.1620,  0.8179],
        [-0.1620,  0.8179]])

3、输入二维张量,指定dim=1,重复次数为3次,表示把输入张量每列元素重复3次

torch.repeat_interleave(a,3,dim=1)
结果:
tensor([[ 0.0033,  0.0033,  0.0033, -0.3267, -0.3267, -0.3267],
        [-0.8046, -0.8046, -0.8046,  0.5277,  0.5277,  0.5277],
        [-0.1620, -0.1620, -0.1620,  0.8179,  0.8179,  0.8179]])

4、输入二维张量,指定dim=0,重复次数为一个张量列表b=[n1,n2,n3],表示在(dim=0)对应行上面重复n1,n2,n3遍,张量列表的长度必须与dim=0的维度的长度一样,否则会报错。因为要对行进行重复,a的行数要和n的数量一致。

torch.repeat_interleave(a,torch.tensor([2,3,4]),dim=0)
结果:
tensor([[ 0.0033, -0.3267],
        [ 0.0033, -0.3267],
        [-0.8046,  0.5277],
        [-0.8046,  0.5277],
        [-0.8046,  0.5277],
        [-0.1620,  0.8179],
        [-0.1620,  0.8179],
        [-0.1620,  0.8179],
        [-0.1620,  0.8179]])

5、输入二维张量,指定dim=1,重复次数为一个张量列表[n1,n2],表示在(dim=1)对应列上面重复n1,n2遍,张量列表的长度必须与dim=1的维度的长度一样,否则会报错.因为要对列进行重复,a的列数要和n的数量一致。

torch.repeat_interleave(a,torch.tensor([2,6]),dim=1)
结果:
tensor([[ 0.0033,  0.0033, -0.3267, -0.3267, -0.3267, -0.3267, -0.3267, -0.3267],
        [-0.8046, -0.8046,  0.5277,  0.5277,  0.5277,  0.5277,  0.5277,  0.5277],
        [-0.1620, -0.1620,  0.8179,  0.8179,  0.8179,  0.8179,  0.8179,  0.8179]])

6、

b = torch.randn(3,4)
b
结果:
tensor([[ 0.8856,  0.0129, -1.3439, -0.3765],
        [-0.7506,  0.0546,  1.0429, -1.7856],
        [-0.2488, -0.7265,  0.1560,  0.5211]])
print(torch.repeat_interleave(b,torch.tensor([2,3,4]),dim=0))
print(torch.repeat_interleave(b,torch.tensor([2,3,4,5]),dim=1))
结果:
tensor([[ 0.8856,  0.0129, -1.3439, -0.3765],
        [ 0.8856,  0.0129, -1.3439, -0.3765],
        [-0.7506,  0.0546,  1.0429, -1.7856],
        [-0.7506,  0.0546,  1.0429, -1.7856],
        [-0.7506,  0.0546,  1.0429, -1.7856],
        [-0.2488, -0.7265,  0.1560,  0.5211],
        [-0.2488, -0.7265,  0.1560,  0.5211],
        [-0.2488, -0.7265,  0.1560,  0.5211],
        [-0.2488, -0.7265,  0.1560,  0.5211]])
tensor([[ 0.8856,  0.8856,  0.0129,  0.0129,  0.0129, -1.3439, -1.3439, -1.3439,
         -1.3439, -0.3765, -0.3765, -0.3765, -0.3765, -0.3765],
        [-0.7506, -0.7506,  0.0546,  0.0546,  0.0546,  1.0429,  1.0429,  1.0429,
          1.0429, -1.7856, -1.7856, -1.7856, -1.7856, -1.7856],
        [-0.2488, -0.2488, -0.7265, -0.7265, -0.7265,  0.1560,  0.1560,  0.1560,
          0.1560,  0.5211,  0.5211,  0.5211,  0.5211,  0.5211]])

torch.unsqueeze()& torch.squeeze()

torch.unsqueeze()

unsqueeze() 函数是 PyTorch 中的一个张量操作函数,用于在指定位置添加一个新的维度。该函数的作用是在张量的指定位置插入一个新的维度,从而改变张量的形状。

unsqueeze(dim) 函数接受一个参数 dim,用于指定在哪个位置插入新的维度。dim 参数的取值范围为 -len(input) - 1 到 len(input)。其中,负数表示从最后一个维度开始计数。如果 dim 是负数,则表示从最后一个维度开始计数插入新的维度,如果 dim 是正数,则表示从第一个维度开始计数插入新的维度。

例如,如果一个张量的形状为 (3, 4, 5),则可以通过 unsqueeze(0) 在第一个维度前插入一个新的维度,结果形状为 (1, 3, 4, 5);通过 unsqueeze(-1) 在最后一个维度后插入一个新的维度,结果形状为 (3, 4, 5, 1)。

x = torch.tensor([[1, 2, 3, 4],
                  [5, 6, 7, 8],
                  [9, 10, 11, 12]])

在第一个维度前插入一个新的维度

y = x.unsqueeze(0)
print(y.shape) 
y
结果:
torch.Size([1, 3, 4])
tensor([[[ 1,  2,  3,  4],
         [ 5,  6,  7,  8],
         [ 9, 10, 11, 12]]])

在最后一个维度后插入一个新的维度

z = x.unsqueeze(-1)
print(z.shape)  # 输出:torch.Size([3, 4, 1])
z
结果:
torch.Size([3, 4, 1])
tensor([[[ 1],
         [ 2],
         [ 3],
         [ 4]],

        [[ 5],
         [ 6],
         [ 7],
         [ 8]],

        [[ 9],
         [10],
         [11],
         [12]]])

在第一个维度后插入一个新的维度

z1 = x.unsqueeze(1)
print(z1.shape)
z1
torch.Size([3, 1, 4])
tensor([[[ 1,  2,  3,  4]],

        [[ 5,  6,  7,  8]],

        [[ 9, 10, 11, 12]]])

torch.squeeze()

squeeze() 函数是 PyTorch 中的一个张量操作函数,用于去除张量中的尺寸为 1 的维度。该函数的作用是压缩张量中尺寸为 1 的维度,从而改变张量的形状。

squeeze(dim=None) 函数接受一个参数 dim,用于指定要去除的维度。如果不提供 dim 参数,则会去除所有尺寸为 1 的维度。如果提供了 dim 参数,则只会去除指定位置的尺寸为 1 的维度。

dim 参数的取值范围与 unsqueeze() 函数相同,负数表示从最后一个维度开始计数。

x = torch.randn(1, 3, 1, 4)

去除所有尺寸为 1 的维度

y = x.squeeze()
print(y.shape)  # 输出:torch.Size([3, 4])
结果:
torch.Size([3, 4])

去除指定位置的尺寸为 1 的维度

z = x.squeeze(0)
print(z.shape)

此时第一个维度的维度不是1,删除失败

结果:
torch.Size([1, 3, 1, 4])

删除第三个维度

w = x.squeeze(2)
print(w.shape)    # 输出:torch.Size([1, 3, 1])

删除成功

torch.Size([1, 3, 4])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值