Numpy和Tensor

关于张量Tensor

1. “张量”并非 PyTorch 独有

虽然你问的是 torch 库,但需要知道,“张量”是深度学习领域的通用数学概念:

PyTorch 中叫 torch.Tensor

TensorFlow 中叫 tf.Tensor

JAX 中也有类似的 DeviceArray

它们在设计理念上高度一致,都是对 NumPy 的 ndarray 的“进化版”。

2. Tensor 和 NumPy ndarray 的关系(重点)

你可以把 torch.Tensor 理解为 “带 GPU 加速和自动求导功能的 NumPy 数组”:

相同点:用法极其相似,支持索引、切片、广播、各种数学运算,语法几乎和 NumPy 无缝切换。

升级点(核心差异):

GPU 加速:张量可以轻松从 CPU 搬到 GPU(.cuda()),实现并行计算,这是深度学习的算力基础。

自动求导(Autograd):张量可以记录运算历史(requires_grad=True),PyTorch 会自动帮您计算梯度,这是训练神经网络反向传播的核心。

3. 关于你问的 “tensor向量”

在 PyTorch 中,“向量”特指 1 维的张量(1D Tensor)。张量的维度(秩)决定了它的叫法:

0 维:标量(一个数)

1 维:向量(一组数) → 这就是你说的“tensor向量”

2 维:矩阵(表格)

3 维及以上:高维张量(如图片批次 [Batch, Channel, Height, Width])

关于Numpy,首先NumPy 的绝对基石是 ndarray(N维数组对象)

一、Numpy是 Python 科学计算生态的基石,围绕其核心的 ndarray 对象,提供了一整套高效、精密的数值计算工具箱

1. 高级数学与统计运算

NumPy 内置了大量数学和统计函数,可以直接在整个数组上操作。

数学运算: 包括三角函数、指数对数、加减乘除等。

统计函数: 提供如均值 (mean)、标准差 (std)、方差 (var)、中位数、百分位数 (percentile) 等统计量的计算。

线性代数 (numpy.linalg): 提供矩阵乘法、求解线性方程组、计算特征值、进行奇异值分解 (SVD) 等高级运算。

傅里叶变换 (numpy.fft): 用于将信号从时域转换到频域,在信号处理、图像处理等领域应用广泛。

随机数生成 (numpy.random): 支持从多种概率分布(如正态分布、均匀分布等)中生成随机数,用于模拟和采样。

2. 数据操作与实用工具

除了数值计算,NumPy 还提供了大量辅助功能。

数组操作:除了我们讨论过的索引、切片,还包括改变形状 (reshape)、转置 (transpose)、拼接 (concatenate) 等。

排序、搜索与计数:提供对数组进行排序 (sort)、搜索特定值、统计元素个数等功能。

文件输入/输出 (I/O):能够将数组数据高效地读写到磁盘上的文本或二进制文件中。

二、**NumPy 最大的价值之一,在于它是整个 Python 科学计算生态的“通用语”。

与其他库交互: Pandas、SciPy、Matplotlib、scikit-learn 乃至深度学习的 PyTorch 和 TensorFlow,其底层数据结构和运算都深度依赖于 NumPy。掌握 NumPy 是使用这些高级库的前提。
  1. 数据结构的基石:ndarray 与内存布局

这是物理上的“地基”。ndarray 本质上是一个数据块指针,它要求所有元素类型相同(由 dtype 定义),并在内存中连续存储(默认按 C 语言的行优先顺序)。

这种设计让 CPU 能通过内存地址直接计算偏移量(借助 strides 步长)来定位元素,访问速度极快,且缓存命中率极高。

  1. 计算方式的基石:向量化运算(ufunc)

这是逻辑上的“发动机”。如果没有向量化,ndarray 就是个普通容器。NumPy 将所有循环操作都“下沉”到了 C 语言层,让你能对整个数组执行数学运算,而无需写 Python 级别的 for 循环。

这种“数组级编程”模式,是 NumPy 比原生 Python 列表快几十到上百倍的根源。

  1. 交互规则的基石:广播机制(Broadcasting)

这是数组间的“语法规则”。它定义了不同形状(shape)的数组如何进行算术运算。正是这套规则,让你能用 arr + 1 给所有元素加 1,或者让 (3,4) 和 (4,) 的数组无缝相加,极大地简化了代码,同时又避免了低效的复制内存。

打个形象的比方:
如果 NumPy 是一座城市:

ndarray(连续内存 + dtype) 是城市规划图(决定了建筑怎么盖,数据怎么铺);

向量化运算(ufunc) 是高铁网络(决定了运算速度有多快);

广播机制 是交通规则(决定了不同尺寸的“数据车”怎么并道行驶)。

点击查看Numpy代码
#学习矩阵
import numpy
import numpy as np
# import torch

#1.首先看一下列表和矩阵的不同, 通过打印的方式
list1 = [
    [1,2,3,4,5],
    [6,7,8,9,10],
    [11,12,13,14,15]
 ]
print(list1)
#把列表list1转化为矩阵, 就是一个有逗号,一个没有
array1 = np.array(list1) 
print(array1)
# array2 = np.array(list1)
# #矩阵的合并操作 
# array3 = np.concatenate((array1,array2),axis=0)  #axis表示轴
# print(array3)
# array4 = np.concatenate((array1,array2),axis=1)      
# print(array4)                  
#矩阵的切片
print(array1[1:3])  # array1[1:3] 取出索引为 [1, 2] 的元素,不包含索引3,array下标默认从0开始;range(1, 3) 生成 [1, 2]不包含 3;
print(array1[1:3,1:4])
点击查看Tensor代码
import torch
import numpy as np


'''如何列表转为张量,如何创建张量,如何求梯度'''
list1 = [
        [1,2,3,4,5],
        [6,7,8,9,10],
        [11,12,13,14,15]
    ]
array1 = np.array(list1)
tensor1 = torch.tensor(array1)  #创建张量,也可以这样写tensor1 = torch.tensor(list1)
print(list1)
print(array1)
print(tensor1)

# x = torch.tensor(3.0)  #创建张量
# x.requires_grad_(True)
# y = x**2
# y.backward()  #求函数梯度
# print(x.grad)  #2x 当x=3时,值是6

# #x = x.detach()  #detach表示取下来的意思
# x.grad = torch.tensor(0.0)
# x = torch.tensor(3.0)  #创建张量
# x.requires_grad_(True)
# y2 = x**2
# y2.backward()  #求函数梯度
# print(y2)
# print(x.grad)


# '''如何创建一个多维的张量,如何创建一个有方差的张量'''
# tensor1 = torch.ones((10,4)) #创建一个内容为1, 形状为10行4列的张量
# print(tensor1)
# tensor2 = torch.zeros((5,4))
# print(tensor2)
# tensor3 = torch.normal(100,0.002,(5,4))   #创建一个内容为100,方差是0.02, 形状为5行4列的张量
# print(tensor3)

'''张量内部 每行/每列求和'''
# tensor1 = torch.ones((10,4))
# sum1 = torch.sum(tensor1, dim=0)  #dim表示维度,dim=0表示竖着求和, dim=1表示横着求和 每行, dim=2表示z轴方向上的数求和
# print(tensor1)
# print(sum1)

# sum2 = torch.sum(tensor1, dim=1, keepdim=True)
# print(sum2)


posted @ 2026-08-23 00:21  小小冰&碎冰冰  阅读(5)  评论(0)    收藏  举报