数据操作-运算

一、张量

概念:张量表示一个数值组成的数组,这个数组可能有多个维度

具有一个轴的张量对应数学上的向量(vector)

具有两个轴的张量对应数学上的矩阵(matrix)

 

二、数据操作

1、使用arange创建一个行向量。创建的行向量包含从0开始的前12个整数,默认创建为浮点数。张量中的每个值都称为张量的元素(element)

1
2
3
4
5
6
7
8
9
#第一步,导入pytorch包
import torch
 
#第二步,创建行向量
# 新的张量存储在内存中,并采用基于CPU的计算
x = torch.arange(12)
print(x,type(x))
 
x.shape<br><br>#输出结果tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]) <class 'torch.Tensor'><br>torch.Size([12])

  

2、可以使用张量shape属性来访问张量的形状,对向量来说可以理解为求张量中元素的总数,对矩阵来说,可以理解为沿每个轴的长度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
print(x.shape)
x.numel()
 
y=torch.tensor([[1,2,3],[4,5,6]])
print(y.shape)
print(y)
 
 
#输出结果
#可以看见,因为x是向量,可以直接查看元素个数
torch.Size([12])
#因为y是矩阵,shape便显示在每个方向上的大小,也就是元素个数
torch.Size([2, 3])
tensor([[1, 2, 3],
        [4, 5, 6]])

  

3、改变一个张量的形状而不改变元素数量和元素值,可以调用 reshape 函数,同时注意的是,reshape函数只改变他的形状不改变元素值。

我们可以用x.reshape(-1,4)x.reshape(3,-1)来取代x.reshape(3,4),-1表示缺省值,由系统自动计算出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# x是一个向量,也就是一个12*1的矩阵
print(x)
print(type(x))
 
# 使用reshape函数把它变为一个三行四列的矩阵
# 只是形状发生了变化,但是值的大小没有变化
X = x.reshape(3, 4)
print(X)
print(type(X))
 
#输出
 
tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
<class 'torch.Tensor'>
tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]])
<class 'torch.Tensor'>

  

4、使用全0、全1、其他常量或者从特定分布中随机采样的数字来初始化矩阵

设置全0:zeros

1
2
3
4
5
6
7
8
9
10
11
12
13
# zeros将所有元素设为0
torch.zeros((2, 3, 4))
#通过输出可以发现,在这个张量中有两个元素,每个元素由一个‘两行三列’的元素组成
 
输出结果:
 
tensor([[[0., 0., 0., 0.],
         [0., 0., 0., 0.],
         [0., 0., 0., 0.]],
 
        [[0., 0., 0., 0.],
         [0., 0., 0., 0.],
         [0., 0., 0., 0.]]])

设置全1:ones

1
2
3
4
5
6
7
8
9
10
11
12
# ones将所有元素设为1
torch.ones((2, 3, 4))
 
#输出结果
 
tensor([[[1., 1., 1., 1.],
         [1., 1., 1., 1.],
         [1., 1., 1., 1.]],
 
        [[1., 1., 1., 1.],
         [1., 1., 1., 1.],
         [1., 1., 1., 1.]]])

随机设置:randn

1
2
3
4
5
6
7
8
# randn创建一个形状为(3,4)的张量,每个元素都从均值为0、标准差为1的正态分布中随机采样
torch.randn(3, 4)
 
#输出结果
 
tensor([[-0.1957, -0.0284,  1.0563,  0.2526],
        [-0.4205,  0.2026,  0.2376, -0.3273],
        [-0.6187,  0.3032, -0.0050, -0.6948]])

  

5、直接赋值创建tensor

通过提供包含数值的python列表来为所需张量中的每个元素赋予确定值。在这里,最外层的列表对应于轴0,内层的列表对应于轴1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
y=torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
 
x=torch.tensor([[1,2,3],[4,5,6]])
 
print(x)
print(y)
 
#输出结果
 
tensor([[1, 2, 3],
        [4, 5, 6]])
tensor([[2, 1, 4, 3],
        [1, 2, 3, 4],
        [4, 3, 2, 1]])

  

6、数据运算——加减乘除

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
x = torch.tensor([1.0, 2, 4, 8])
y = torch.tensor([2, 2, 2, 2])
 
# size()不能看一个张量的个数,可以看arange向量的个数
# numel()可以查看一个张量中元素的个数
print(x)
print(x.numel())
print(y)
print(y.numel())
x + y, x - y, x * y, x / y, x**y  # **运算符是求幂运算
 
#输出结果
 
tensor([1., 2., 4., 8.])
4
tensor([2, 2, 2, 2])
4
(tensor([ 3.,  4.,  6., 10.]),
 tensor([-1.,  0.,  2.,  6.]),
 tensor([ 2.,  4.,  8., 16.]),
 tensor([0.5000, 1.0000, 2.0000, 4.0000]),
 tensor([ 1.,  4., 16., 64.]))

  

7、指数运算,就e的次方

1
2
3
4
5
6
7
8
9
# 求e的多少次方
import math
print(math.exp(1))<br># 可以直接按元素顺序进行计算
torch.exp(x)
 
#输出结果
 
2.718281828459045
tensor([2.7183e+00, 7.3891e+00, 5.4598e+01, 2.9810e+03])

  

8、张量连接

把多个张量 连结(concatenate) 在一起,把它们端对端地叠起来形成一个更大的张量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
X = torch.arange(12, dtype=torch.float32).reshape((3, 4))
print(X,type(X))
 
Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
print(Y,type(Y))
 
# cat函数用于连接两个tensor
# dim=0 表示按行连接
print(torch.cat((X, Y), dim=0))
# dim=1 表示按列连接
print(torch.cat((X, Y), dim=1))
 
#输出结果
 
tensor([[ 0.,  1.,  2.,  3.],
        [ 4.,  5.,  6.,  7.],
        [ 8.,  9., 10., 11.]]) <class 'torch.Tensor'>
tensor([[2., 1., 4., 3.],
        [1., 2., 3., 4.],
        [4., 3., 2., 1.]]) <class 'torch.Tensor'>
tensor([[ 0.,  1.,  2.,  3.],
        [ 4.,  5.,  6.,  7.],
        [ 8.,  9., 10., 11.],
        [ 2.,  1.,  4.,  3.],
        [ 1.,  2.,  3.,  4.],
        [ 4.,  3.,  2.,  1.]])
tensor([[ 0.,  1.,  2.,  3.,  2.,  1.,  4.,  3.],
        [ 4.,  5.,  6.,  7.,  1.,  2.,  3.,  4.],
        [ 8.,  9., 10., 11.,  4.,  3.,  2.,  1.]])

  

9、逻辑运算符构建二元张量

以 X == Y 为例。 对于每个位置,如果 X 和 Y 在该位置相等,则新张量中相应项的值为1,这意味着逻辑语句 X == Y 在该位置处为真,否则该位置为 0

1
2
3
4
5
6
7
8
9
# 通过逻辑运算符构建二元张量
# 如果X、Y在该位置相等,则新张量中相应项的值为1
X == Y
 
#输出结果
 
tensor([[False, False, False, False],
        [False, False, False, False],
        [False, False, False, False]])

  

10、张量中所有元素求和会产生一个只有一个元素的张量

1
2
3
4
5
6
# 对所有元素求和,产生了一个只有一个元素的张量
X.sum()
 
#输出结果
 
tensor(66.)

  

 

posted @   小秦同学在上学  阅读(136)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示