Pytorch | 标量、向量、张量的区别

发布时间 2023-06-30 16:11:08作者: 张Zong在修行

基本概念

标量、向量和张量是数学和物理中经常使用的概念,它们的主要区别在于它们所描述的量的性质和维度。

  1. 标量(Scalar):标量是一个单独的数,它没有方向和大小之分。在物理学中,标量常常用于描述某个物理量的大小,比如温度、质量、时间等。标量可以用一个数字或符号表示,例如,温度为 20℃,质量为 10kg。
  2. 向量(Vector):向量是一个有方向和大小的量。在物理学中,向量通常用于描述物体的运动和力的作用方向和大小。向量可以用一个有序元组(通常是 n 个实数)表示,例如,速度为 (2,3,4)m/s,力为 (5,0,0)N。
  3. 张量(Tensor):张量是一个多维数组,它可以包含多个向量和标量。在物理学中,张量通常用于描述物理场的变化和物质的性质等。张量可以看作是向量的推广,向量可以看作是一维张量。张量可以用一个多维数组表示,例如,矩阵可以看作是二维张量。

总之,标量、向量和张量是三个不同的数学概念,它们描述了不同维度和不同性质的数值和物理量。在物理学、工程学、计算机图形学等领域,这些概念都有广泛的应用。

向量和张量的表示和操作

向量和张量通常是用不同的数据结构来表示的,这些数据结构的维度和操作方式也是不同的。下面是一个简单的 Python 代码示例,用来演示向量和张量的表示和操作:

  1. 向量的表示和操作
import numpy as np

# 创建一个三维向量
v1 = np.array([1, 2, 3])

# 创建一个四维向量
v2 = np.array([2, 3, 4, 5])

# 向量的加法
v3 = v1 + v2

# 向量的点乘
dot_product = np.dot(v1, v2)

# 向量的叉乘
cross_product = np.cross(v1, v2)

print("v1: ", v1)
print("v2: ", v2)
print("v3: ", v3)
print("dot_product: ", dot_product)
print("cross_product: ", cross_product)

上面的代码中,我们用 numpy 库中的 array 类型来创建向量,并进行了加法、点乘和叉乘等操作。可以看到,向量的维度可以通过数组的长度来确定,操作方式也比较简单,通常包括加法、点乘、叉乘等。

  1. 张量的表示和操作
# 创建一个二维张量
t1 = np.array([[1, 2], [3, 4]])

# 创建一个三维张量
t2 = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])

# 张量的加法
t3 = t1 + t2

# 张量的缩并
t4 = np.einsum('ijk,jk->i', t2, t1)

print("t1: ", t1)
print("t2: ", t2)
print("t3: ", t3)
print("t4: ", t4)

上面的代码中,我们用 numpy 库中的 array 类型来创建二维和三维张量,并进行了加法和缩并等操作。可以看到,张量的维度可以通过数组的维度来确定,操作方式相对来说比较复杂,常用的操作包括张量积、缩并、对称化、反对称化等,这些操作通常需要用到 numpy 库中的 einsum 函数。

总之,向量和张量都是重要的数学对象,在实际应用中经常用到。在代码实现中,向量和张量的表示和操作方式是不同的,需要根据具体的需求和问题选择合适的数据结构和操作方式。

向量和张量的维度概念

几维向量和几维张量的维度概念是不同的。虽然它们都是多维数学对象,但它们的维度概念和含义是不同的。

在向量的概念中,维度通常指向量的长度或分量的个数,也就是向量的维数。例如,一个长度为 n 的向量可以表示为 $v = [v_1, v_2, ..., v_n]$,它的维度就是 n。

在张量的概念中,维度通常指张量的秩或阶数,也就是张量所包含的轴数或维数。例如,一个二维张量可以表示为 $T_{ij}$,它的维度就是 2。

因此,向量和张量的维度概念是不同的,虽然都是多维数学对象,但向量的维度指向量的长度或分量的个数,而张量的维度指张量所包含的轴数或维数。在实际应用中,需要注意这两个概念的区别,以便正确地表示和操作向量和张量。

代码示例:

import numpy as np

# 创建一个一阶张量(向量)
t1 = np.array([1, 2, 3])

# 创建一个二阶张量(矩阵)
t2 = np.array([[1, 2], [3, 4]])

# 创建一个三阶张量
t3 = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])

# 创建一个四阶张量
t4 = np.array([[[[1, 2], [3, 4]], [[5, 6], [7, 8]]], [[[9, 10], [11, 12]], [[13, 14], [15, 16]]]])

# 张量的加法
t5 = t3 + t4

# 张量的缩并
t6 = np.einsum('ijkl,jkm->il', t4, t2)

print("t1: ", t1)
print("t2: ", t2)
print("t3: ", t3)
print("t4: ", t4)
print("t5: ", t5)
print("t6: ", t6)

上面的代码中,我们用 numpy 库中的 array 类型来创建一阶、二阶、三阶、四阶张量,并进行了加法和缩并等操作。可以看到,不同秩的张量的维度可以通过张量的阶数来确定,操作方式也比较复杂,通常包括张量积、缩并、对称化、反对称化等。

总之,张量是一个多维数组,它可以包含多个向量和标量。张量的维度通常指张量的秩或阶数,也就是张量所包含的轴数或维数。不同秩的张量的表示和操作方式都比较复杂,需要根据具体的需求和问题选择合适的数据结构和操作方式。