【pyTorch学习笔记②】Numpy基础·下篇
创始人
2025-05-30 00:01:49

本文参加新星计划人工智能(Pytorch)赛道: https://bbs.csdn.net/topics/613989052

文章目录

  • 五、Numpy算术运算
    • 1.元素对应相乘
    • 2.数组和标量运算
    • 3.点积(元素内积)
  • 六、数组变形
    • (一)改变形状
      • 1.reshape
      • 2.resize
      • 3.T(转置)
      • 4.ravel(展平)
      • 5.flatten
      • 6.squeeze
      • 7.transpose
    • (二)合并数组
      • 1.append
      • 2.concatenate
      • 3.stack
      • 4.hstack 、vstack 和 dstack
      • 5.vsplit 和 hsplit
  • 七、批量处理
  • 八、通用函数(ufunc)
  • 九、广播机制

五、Numpy算术运算

1.元素对应相乘

A = np.array([[1, 2], [-1, 4]])
B = np.array([[2, 0], [3, 4]])
print(A)
>>>[[ 1  2] [-1  4]]
print(B)
>>>[[2 0]   [3 4]] 
print(A*B)
>>>[[ 2  0] [-3 16]]
print(np.multiply(A,B))
>>>[[ 2  0] [-3 16]]

2.数组和标量运算

A = np.array([[1, 2], [-1, 4]])
print(A)
>>>[[ 1  2] [-1  4]]
print(A/2.0)
>>>[[ 0.5  1. ] [-0.5  2. ]]
print(A*2.0)
>>>[[ 2.  4.][-2.  8.]]

3.点积(元素内积)

X1 = np.array([[1,2],[3,4]])
X2 = np.array([[1,2,3],[4,5,6]])
X3 = np.dot(X1,X2)
print(X3)
>>>[[ 9 12 15][19 26 33]]

六、数组变形

在矩阵或者数组运算中,经常会遇到需要把多个向量或者矩阵按某轴方向合并、展开。比如,在卷积或循环神经网络中,在全连接层之前,需要把矩阵展平。

(一)改变形状

1.reshape

改变向量的维度,不修改向量本身

# reshape
arr = np.arange(10)
print(arr)
>>>[0 1 2 3 4 5 6 7 8 9]
# 将arr变换为2*5
print(arr.reshape(2,5))
>>>[[0 1 2 3 4][5 6 7 8 9]]
# 指定列数或行数,其他用-1代替
print(arr.reshape(5,-1))
>>>[[0 1][2 3][4 5][6 7][8 9]]
print(arr.reshape(-1,5))
>>>[[0 1 2 3 4][5 6 7 8 9]]

2.resize

改变向量的维度,且修改向量本身

# resize
arr = np.arange(10)
print(arr)
>>>[0 1 2 3 4 5 6 7 8 9]
# 将向量arr维度变换为2行5列
arr.resize(2,5)
print(arr)
>>>[[0 1 2 3 4][5 6 7 8 9]]

3.T(转置)

# T(转置)
arr = np.arange(12).reshape(3,4)
print(arr)
>>>[[ 0  1  2  3][ 4  5  6  7][ 8  9 10 11]]
print(arr.T)
>>>[[ 0  4  8][ 1  5  9][ 2  6 10][ 3  7 11]]

4.ravel(展平)

# ravel(展平)
arr = np.arange(6).reshape(2,-1)
print(arr)
>>>[[0 1 2][3 4 5]]
# 按列优先展平
print(arr.ravel('F'))
>>>[0 3 1 4 2 5]
# 按行优先展平
print(arr.ravel())
>>>[0 1 2 3 4 5]

5.flatten

把矩阵转换为向量

# flatten
a = np.floor(10*np.random.random((3,4)))
print(a)
>>>[[0. 0. 6. 8.][3. 1. 8. 8.][6. 4. 1. 8.]]
print(a.flatten())
>>>[0. 0. 6. 8. 3. 1. 8. 8. 6. 4. 1. 8.]

6.squeeze

用来降维的函数,把矩阵中含1的维度去掉。

arr = np.arange(3).reshape(3,1)
print(arr)
>>>[[0][1][2]]
print(arr.squeeze().shape)
>>>(3,)
arr1 = np.arange(6).reshape(3,1,2,1)
print(arr1.shape)
>>>(3, 1, 2, 1)
print(arr1.squeeze().shape)
>>>(3, 2)

7.transpose

对高危矩阵进行轴对换。如,把RGB改为GBR

arr = np.arange(24).reshape(2,3,4)
print(arr.shape)
>>>(2, 3, 4)
print(arr.transpose(1,2,0).shape)
>>>(3, 4, 2)

(二)合并数组

1.append

有axis参数,控制按行/按列合并,内存占用大。

# 合并一维数组
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = np.append(a,b)
print(c)
>>>[1 2 3 4 5 6]
# 合并多维数组
a = np.arange(4).reshape(2,2)
b = np.arange(4).reshape(2,2)
print(np.append(a,b,axis = 0))
>>>[[0 1][2 3][0 1][2 3]]
print(np.append(a,b,axis = 1))
>>>[[0 1 0 1][2 3 2 3]]

2.concatenate

a = np.arange(4).reshape(2,2)
b = np.arange(4).reshape(2,2)
print(np.concatenate((a,b),axis = 0))
>>>[[0 1][2 3][0 1][2 3]]
print(np.concatenate((a,b),axis = 1))
>>>[[0 1 0 1][2 3 2 3]]

3.stack

沿指定轴堆叠数组/矩阵
要求形状一样

a = np.arange(4).reshape(2,2)
b = np.arange(4,8).reshape(2,2)
print(np.stack((a,b),axis = 0))
>>>[[[0 1][2 3]][[4 5][6 7]]]
print(np.stack((a,b),axis = 1))
>>>[[[0 1][4 5]][[2 3][6 7]]]

4.hstack 、vstack 和 dstack

a = np.arange(4).reshape(2,2)
b = np.arange(4,8).reshape(2,2)
print(np.hstack((a,b)))
>>>[[0 1 4 5][2 3 6 7]]
print(np.vstack((a,b)))
>>>[[0 1][2 3][4 5][6 7]]
print(np.dstack((a,b)))
>>>[[[0 4][1 5]][[2 6][3 7]]]

5.vsplit 和 hsplit

按行和按列分割

a = np.arange(12).reshape(3,4)
print(a)
>>>[[ 0  1  2  3][ 4  5  6  7][ 8  9 10 11]]
print(np.vsplit(a,[1,2]))
>>>[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]
print(np.hsplit(a,[1,2]))
>>>[array([[0],[4],[8]]), array([[1],[5],[9]]), array([[ 2,  3],[ 6,  7],[10, 11]])]

七、批量处理

一般步骤:
1.随机打乱数据
2.定义批大小
3.批处理数据

# 生成10000个形状为2*3的矩阵(一个10000*2*3形状的矩阵,第1维为样本数,后2维是数据)
data_train = np.random.randn(10000,2,3)# 打乱数据
np.random.shuffle(data_train)# 定义批大小
batch_size = 1000# 进行批处理数据
for i in range(0,len(data_train)//batch_size):x_batch_sum = np.sum(data_train[i:i+batch_size])print("第{}批次,该批次数据和为:{}".format(i+1,x_batch_sum))
>>>第1批次,该批次数据和为:19.831597230692044第2批次,该批次数据和为:25.740728092864465第3批次,该批次数据和为:27.055236935523748第4批次,该批次数据和为:33.117813938724495第5批次,该批次数据和为:25.877849245176712第6批次,该批次数据和为:28.51526070095471第7批次,该批次数据和为:23.45418417276757第8批次,该批次数据和为:29.85505288703944第9批次,该批次数据和为:32.270674668876第10批次,该批次数据和为:34.17904037831163

八、通用函数(ufunc)

许多ufunc函数都是由C语言编写,速度比较快。
比math灵活。math一般是标量,Numpy可以是向量和矩阵,减少了循环语句的使用。

函数名称功能
sqrt计算序列化数据的平方根
sin、cos三角函数
abs计算序列化数据的绝对值
dot矩阵计算(点积、向量内积)
log,log10,log2对数函数
exp指数函数
cumsum,cumproduct累计求和、求积
sum对序列化数据求和
mean计算均值
median计算中位数
std计算标准差
var计算方差
corrcoef计算相关系数
a = np.arange(10).reshape(2,5)
b = np.arange(-5,5).reshape(5,2)
print(a)
>>>[[0 1 2 3 4] [5 6 7 8 9]]
print(b)
>>>[[-5 -4][-3 -2][-1  0][ 1  2][ 3  4]]
print(np.sqrt(a))
>>>[[0.         1.         1.41421356 1.73205081 2.        ]      [2.23606798 2.44948974 2.64575131 2.82842712 3.        ]]
print(np.sin(a))
>>>[[0.         1.         1.41421356 1.73205081 2.        ]      [2.23606798 2.44948974 2.64575131 2.82842712 3.        ]]
print(np.cos(a))
>>>[[ 1.          0.54030231 -0.41614684 -0.9899925  -0.65364362] [ 0.28366219  0.96017029  0.75390225 -0.14550003 -0.91113026]]
print(np.abs(b))
>>>[[5 4][3 2][1 0][1 2][3 4]]
print(np.dot(a,b))
>>>[[ 10  20][-15  20]]
print(np.log2(a))
>>>[[      -inf 0.         1.         1.5849625  2.        ][2.32192809 2.5849625  2.80735492 3.         3.169925  ]]
print(np.exp(a))
>>>[[1.00000000e+00 2.71828183e+00 7.38905610e+00 2.00855369e+015.45981500e+01][1.48413159e+02 4.03428793e+02 1.09663316e+03 2.98095799e+038.10308393e+03]]
print(np.cumsum(a))
>>>[ 0  1  3  6 10 15 21 28 36 45]
print(np.cumproduct(a))
>>>[0 0 0 0 0 0 0 0 0 0]
print(np.sum(a))
>>>45
print(np.mean(a))
>>>4.5
print(np.median(a))
>>>4.5
print(np.std(a))
>>>2.8722813232690143
print(np.var(a))
>>>8.25
print(np.corrcoef(a))
>>>[[1. 1.][1. 1.]]

九、广播机制

Numpy的Universal functions中要求输入的数组shape是一致的,当不一致时,就要用到广播机制。
有以下规则:
(1)向shape最长的数组看齐,不足补1;
(2)取各轴的最大值
(3)输入数组的某个轴和输出数组的对应轴的长度相同或者为1时,用来计算,否则,出错。
(4)当输入数组的某个轴的长度为1时,沿着此轴的运算都用第一组值。

a = np.arange(0, 40, 10).reshape(4, 1)
b = np.arange(0, 3)
c = a+b
print(a)
>>>[[ 0][10][20][30]]
print(b)
>>>[0 1 2]
print(c)
>>>[[ 0  1  2][10 11 12][20 21 22][30 31 32]]

根据规则2,输出应该是4*3
根据规则4,a应为:[[ 0 1 2] ,b应为:[[ 0 0 0]
[ 0 1 2] , [10 10 10]
[ 0 1 2] , [20 20 20]
[ 0 1 2]] , [30 30 30]]

相关内容

热门资讯

【实验报告】实验一 图像的... 实验目的熟悉Matlab图像运算的基础——矩阵运算;熟悉图像矩阵的显示方法࿰...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
大模型落地比趋势更重要,NLP... 全球很多人都开始相信,以ChatGPT为代表的大模型,将带来一场NLP领...
Linux学习之端口、网络协议... 端口:设备与外界通讯交流的出口 网络协议:   网络协议是指计算机通信网...
kuernetes 资源对象分... 文章目录1. pod 状态1.1 容器启动错误类型1.2 ImagePullBackOff 错误1....
STM32实战项目-数码管 程序实现功能: 1、上电后,数码管间隔50ms计数; 2、...
TM1638和TM1639差异... TM1638和TM1639差异说明 ✨本文不涉及具体的单片机代码驱动内容,值针对芯...
Qt+MySql开发笔记:Qt... 若该文为原创文章,转载请注明原文出处 本文章博客地址:https://h...
Java内存模型中的happe... 第29讲 | Java内存模型中的happen-before是什么? Java 语言...
《扬帆优配》算力概念股大爆发,... 3月22日,9股封单金额超亿元,工业富联、鸿博股份、鹏鼎控股分别为3.0...
CF1763D Valid B... CF1763D Valid Bitonic Permutations 题目大意 拱形排列࿰...
SQL语法 DDL、DML、D... 文章目录1 SQL通用语法2 SQL分类3 DDL 数据定义语言3.1 数据库操作3.2 表操作3....
文心一言 VS ChatGPT... 3月16号,百度正式发布了『文心一言』,这是国内公司第一次发布类Chat...
CentOS8提高篇5:磁盘分...        首先需要在虚拟机中模拟添加一块新的硬盘设备,然后进行分区、格式化、挂载等...
Linux防火墙——SNAT、... 目录 NAT 一、SNAT策略及作用 1、概述 SNAT应用环境 SNAT原理 SNAT转换前提条...
部署+使用集群的算力跑CPU密... 我先在开头做一个总结,表达我最终要做的事情和最终环境是如何的,然后我会一...
Uploadifive 批量文... Uploadifive 批量文件上传_uploadifive 多个上传按钮_asing1elife的...
C++入门语法基础 文章目录:1. 什么是C++2. 命名空间2.1 域的概念2.2 命名...
2023年全国DAMA-CDG... DAMA认证为数据管理专业人士提供职业目标晋升规划,彰显了职业发展里程碑及发展阶梯定义...
php实现助记词转TRX,ET... TRX助记词转地址网上都是Java,js或其他语言开发的示例,一个简单的...
【分割数据集操作集锦】毕设记录 1. 按要求将CSV文件转成json文件 有时候一些网络模型的源码会有data.json这样的文件里...
Postman接口测试之断言 如果你看文字部分还是不太理解的话,可以看看这个视频,详细介绍postma...
前端学习第三阶段-第4章 jQ... 4-1 jQuery介绍及常用API导读 01-jQuery入门导读 02-JavaScri...
4、linux初级——Linu... 目录 一、用CRT连接开发板 1、安装CRT调试工具 2、连接开发板 3、开机后ctrl+c...
Urban Radiance ... Urban Radiance Fields:城市辐射场 摘要:这项工作的目标是根据扫描...
天干地支(Java) 题目描述 古代中国使用天干地支来记录当前的年份。 天干一共有十个,分别为:...
SpringBoot雪花ID长... Long类型精度丢失 最近项目中使用雪花ID作为主键,雪花ID是19位Long类型数...
对JSP文件的理解 JSP是java程序。(JSP本质还是一个Servlet) JSP是&#...
【03173】2021年4月高... 一、单向填空题1、大量应用软件开发工具,开始于A、20世纪70年代B、20世纪 80年...
LeetCode5.最长回文子... 目录题目链接题目分析解题思路暴力中心向两边拓展搜索 题目链接 链接 题目分析 简单来说࿰...