[Machine learning][Part3] numpy 矢量矩阵操作的基础知识
很久不接触数学了,machine learning需要用到一些数学知识,这里在重温一下相关的数学基础知识
矢量
矢量是有序的数字数组。在表示法中,矢量用小写粗体字母表示。矢量的元素都是相同的类型。例如,矢量不包含字符和数字。数组中元素的数量通常被称为维度,数组中元素的数量通常被称为维度,可以使用索引引用矢量的元素。在数学设置中,索引通常从 1 到 n。在计算机科学和这些实验室中,索引通常从 0 运行到 n-1。下面是两个的对比,在计算机中我们使用的是左边code的那种方式,也就是0到n-1
Numpy中的阵列
NumPy 的基本数据结构是一个可索引的 n 维数组,其中包含相同类型 (dtype) 的元素。
一维向量的操作:
向量创建
创建一个指定shape的一维向量,参数可以是整数、元祖等等,参数表示要创建的序列的shape
a= np.zeros(4); print(f"np.zeros(4) : a = {a}, a shape = {a.shape}, a data type = {a.dtype}")
a= np.zeros((4,)); print(f"np.zeros(4,) : a = {a}, a shape = {a.shape}, a data type = {a.dtype}")
a= np.random.random_sample(4); print(f"np.random.random_sample(4): a = {a}, a shape = {a.shape}, a data type = {a.dtype}")
创建一个不指定shape的一维向量
a = np.arange(4.); print(f"np.arange(4.): a = {a}, a shape = {a.shape}, a data type = {a.dtype}")
a = np.random.rand(4); print(f"np.random.rand(4): a = {a}, a shape = {a.shape}, a data type = {a.dtype}")
创建指定值的一维向量
a = np.array([5, 4, 3, 2]); print(f"np.array([5,4,3,2]): a = {a}, a shape = {a.shape}, a data type = {a.dtype}")
a = np.array([5., 4, 3, 2]); print(f"np.array([5.,4,3,2]): a = {a}, a shape = {a.shape}, a data type = {a.dtype}")
向量操作
获取向量元素:通过index和切片可以获得,这个和列表的操作相似。
-
通过index获得:
a = np.arange(10)
print(a)
# 获取Index = 2的元素
print(f"a[2].shape: {a[2].shape} a[2] = {a[2]}, Accessing an element returns a scalar")# 获取最后一个元素
print(f"a[-1]={a[-1]}")# index 必须在向量有效范围以内,否则会报错
try:c = a[10]
except Exception as e:print(e)
- 切片获取元素
# 切片操作通过(start:stop:step)这个三个参数来控制要获取的元素,
# 切片操作是左闭右开,也就是包括index=start的值,但是不包括index=stop的值
# 向量切片操作
a = np.arange(10)
print(f"a = {a}")#获取向量中的从index=2开始到Index=7结束的5个元素, 第三个参数1表示step=1,代表连续取值 (start:stop:step)
c = a[2:7:1]; print("a[2:7:1] = ", c)# 获取向量中的从index=2开始到Index=7结束的元素, 第三个参数1表示step=2,代表隔一个index取一个值 (start:stop:step)
c = a[2:7:2]; print("a[2:7:2] = ", c)# 取index 大于3的所有值
c = a[3:]; print("a[3:] = ", c)# 取index小于3的所有值
c = a[:3]; print("a[:3] = ", c)# 取所有的值
c = a[:]; print("a[:] = ", c)
- 单个向量的操作
a = np.array([1, 2, 3, 4])
print(f"a: {a}")
# 将向量中的元素全部变为相反数
b = -a
print(f"b: {b}")
# 计算向量中所有元素的和并返回一个和的标量
b = np.sum(a)
print(f"b = np.sum(a) : {b}")
# 求向量的平均值
b = np.mean(a)
print(f"b = np.mean(a): {b}")
# 对向量中每个元素求平法
b = a**2
print(f"b = a**2 : {b}")
- 对向量元素的操作,numpy很多对数字的操作也都是用于向量的
# 向量a+向量b, 两个向量长度必须相同,不然会报error
a = np.array([1, 2, 3, 4])
b= np.array([-1, -2, 3, 4])print(f"Binary operators work element wise: {a + b}")# 标量和向量的操作a = np.array([1, 2, 3, 4])
b = 5 * a
print(f"b = 5 * a : {b}")
- 向量与向量的点积
自定义一个实现点积的方法:
def my_dot(a,b):"""Compute the dot product of two vectorsArgs:a (ndarray (n,)): input vectorb (ndarray (n,)): input vector with same dimension as aReturns:x (scalar):"""x = 0for i in range(a.shape[0]):x= x+a[i]*b[i]return x# test my_dot()a = np.array([1,2,3,4])
b = np.array([-1, 4, 3, 2])print(f"my_dot(a, b) = {my_dot(a, b)}")
使用Numpy中的点积方法:
# 使用numpy中的dot来计算点积,返回一个标量
a = np.array([1, 2, 3, 4])
b = np.array([-1, 4, 3, 2])
c = np.dot(a, b)
print(f"NumPy 1-D np.dot(a, b) = {c}, np.dot(a, b).shape = {c.shape} ")
c = np.dot(b, a)
print(f"NumPy 1-D np.dot(b, a) = {c}, np.dot(a, b).shape = {c.shape} ")
然后对上面两种计算点积的方法做个效率上的对比
# 对比一下numpy 的dot和自己写的my_dot的效率如何,可以看出numpy中的效率要高很多
np.random.seed(1)
a = np.random.rand(10000000) # very large arrays
b = np.random.rand(10000000)tic = time.time() # capture start time
c = np.dot(a, b)
toc = time.time() # capture end timeprint(f"np.dot(a, b) = {c:.4f}")
print(f"Vectorized version duration: {1000*(toc-tic):.4f} ms ")tic = time.time() # capture start time
c = my_dot(a,b)
toc = time.time() # capture end timeprint(f"my_dot(a, b) = {c:.4f}")
print(f"loop version duration: {1000*(toc-tic):.4f} ms ")del(a);del(b) #remove these big arrays from memory
运行结果为:可以看到numpy的耗时要少很多
my_dot(a, b) = 24
NumPy 1-D np.dot(a, b) = 24, np.dot(a, b).shape = ()
NumPy 1-D np.dot(b, a) = 24, np.dot(a, b).shape = ()
np.dot(a, b) = 2501072.5817
Vectorized version duration: 6.5184 ms
my_dot(a, b) = 2501072.5817
loop version duration: 2430.3420 ms
矩阵
矩阵是一个二维阵列,里面的元素都是同一类型的。一般用大写黑体字母表示。用两个下标m,n表示,m表示行数,n表示列数。通过两个下标可以访问指定的元素
矩阵操作
创建矩阵
与创建向量的方法一样,只是这里的参数要换成元祖
a = np.zeros((1, 5))
print(f"a shape = {a.shape}, a = {a}")a = np.zeros((2, 1))
print(f"a shape = {a.shape}, a = {a}")a = np.random.random_sample((1, 1))
print(f"a shape = {a.shape}, a = {a}")# 2.创建指定元素的矩阵
a= np.array([[5],[4],[3]])
print(f" a shape = {a.shape}, np.array: a = {a}")
矩阵的操作
# 3.矩阵的操作
# 3.1 下标访问
# reshape 是一种比较方便的方法创建矩阵,
a = np.arange(6).reshape(-1, 2) #reshape(-1,2) 表示生成一个6/2行,2列的矩阵,也就是3行两列的矩阵
print(f"a.shape:{a.shape},\na={a}")
# 访问一个元素
print(f"\na[2.0].shape:{a[2:0].shape},a[2,0]={a[2:0]}, type(a[2,0])={type(a[2,0])} Accessing an element returns a scalar\n")
# 访问一行
print(f"a[2].shape:{a[2].shape},a[2] = {a[2]},type(a[2]) = {type(a[2])}")# 3.2切片访问
a = np.arange(20).reshape(-1, 10)
print(f"a=\n{a}")# 访问一行中5个连续的元素(start:stop:step)
print("a[0,2:7:1]=",a[0, 2:7:1], "a[0,2:7:1].shape=", a[0, 2:7:1].shape, "a-1D array")# 访问两行中5个连续的元素(start:stop:step)
print("a[:, 2:7:1] = \n", a[:, 2:7:1], ", a[:, 2:7:1].shape =", a[:, 2:7:1].shape, "a 2-D array")# 访问矩阵所有元素
print("a[:,:] = \n", a[:,:], ", a[:,:].shape =", a[:,:].shape)# 访问一行中的所有元素,方法1
print("a[1,:] = ", a[1,:], ", a[1,:].shape =", a[1,:].shape, "a 1-D array")
# 访问一行中的所有元素,方法2
print("a[1] = ", a[1], ", a[1].shape =", a[1].shape, "a 1-D array")
相关文章:

[Machine learning][Part3] numpy 矢量矩阵操作的基础知识
很久不接触数学了,machine learning需要用到一些数学知识,这里在重温一下相关的数学基础知识 矢量 矢量是有序的数字数组。在表示法中,矢量用小写粗体字母表示。矢量的元素都是相同的类型。例如,矢量不包含字符和数字。数组中元…...

【中秋国庆不断更】HarmonyOS对通知类消息的管理与发布通知(上)
一、通知概述 通知简介 应用可以通过通知接口发送通知消息,终端用户可以通过通知栏查看通知内容,也可以点击通知来打开应用。 通知常见的使用场景: 显示接收到的短消息、即时消息等。显示应用的推送消息,如广告、版本更新等。显示…...

喜讯 | 怿星科技获评SAE“优秀核心零部件企业”,测试软件平台工具广受赞誉
2023年9月22日-23日,SAE 2023汽车智能与网联技术国际学术会议成功举行。此次学术会议由SAE International与南昌智能新能源汽车研究院联合主办,大会汇聚了来自国内外智能网联领域的顶尖专家和学者。大会同期颁布的奖项旨在向行业推选出更多新时代涌现的杰…...

基于Java的医院预约挂号系统设计与实现(源码+lw+部署文档+讲解等)
文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…...

福利!这两款我自制的免费配色工具你领到了吗?
前两天刚入职,还没干过啥活儿,就迎来了中秋3天国庆7天总共8天的假期,美滋滋。 在这么喜庆的日子里,我觉得大家应该也无心科研,所以不如给大家发点儿福利,继续乐呵乐呵。 当然,说是福利&…...
Docker 网桥、docker0 网桥和 --net host:平台差异、使用方式和场景介绍简介:
Docker 是一个流行的容器化平台,它提供了不同的网络配置选项。其中,Docker 网桥、docker0 网桥和 --net host 是常见的网络部署方式。本文将介绍这些网络选项的平台差异、使用方式以及适用的场景。 Docker 网桥 (Bridge Networking):Docker 网桥是 Docker 默认的网络模式。在…...
【深度学习】系统架构工具链的学习笔记
1. 数据管理 数据版本控制和数据包管理:Activeloop Note: Scale Nucleus:其GitHub(nucleus-python-client)的stars数量少于 Deep Lake。Quilt:其GitHub(quilt)的stars数量少于 Deep Lake。...

Linux 网络编程
套接字(Socket): 通过网络实现跨机通信 作用:一种文件描述符传输层的文件描述符 整个编程中,需要着重注意htonl/htons、ntohl/ntohs、inet_addr等 TCP的C/S实现 循环服务器模型 TCP服务器实现过程 1.创建套接字&a…...

SpringBoot读取配置的方式
在 Spring Boot 应用中,我们通常需要一些配置信息来指导应用的运行。这些配置信息可以包括如下内容:端口号、数据库连接信息、日志配置、缓存配置、认证配置、等等。Spring Boot 提供了多种方式来读取这些配置信息。读取配置的目的是为了在程序中使用这些…...
c# winform程序,DispatcherTimer被调用延迟,响应间隔长
c# winform程序,DispatcherTimer被调用延迟,响应间隔长 最近修改的问题,winform界面上两个控件的数据刷新,用DispatcherTimer定时刷新,但是在某些机器上的实际刷新时间间隔远远大于设置时间。 既然MSDN已经说了&…...

【智能家居项目】裸机版本——项目介绍 | 输入子系统(按键) | 单元测试
🐱作者:一只大喵咪1201 🐱专栏:《智能家居项目》 🔥格言:你只管努力,剩下的交给时间! 目录 🏀项目简介🏀输入子系统(按键)⚽应用层⚽设备层⚽ 内核层抽象层⚽…...
算法练习8——有序三元组中的最大值
LeetCode 100088 有序三元组中的最大值 I LeetCode 100086 有序三元组中的最大值 II 给你一个下标从 0 开始的整数数组 nums 。 请你从所有满足 i < j < k 的下标三元组 (i, j, k) 中,找出并返回下标三元组的最大值。如果所有满足条件的三元组的值都是负数&am…...
git创建
问: git remote add origin https://github.com//blog.git fatal: not a git repository (or any of the parent directories): .git 回答: 这个错误提示指出当前目录或其父目录中不存在.git文件夹,因此无法执行git相关操作。请确保你是在一个已经初始化为git仓库…...

yolov8 opencv模型部署(python版)
yolov8 opencv模型部署(python版) 使用opencv推理yolov8模型,以yolov8n为例子,一共几十行代码,没有废话,给出了注释,从今天起,少写一行代码,少掉一根头发。测试数据有需…...

Simulink仿真封装中的参数个对话框设置
目录 参数和对话框窗格 初始化窗格 文档窗格 为了更加直观和清晰的分析仿真,会将多个元件实现的一个功能封装在一起,通过参数对话框窗格,可以使用参数、显示和动作选项板中的对话框控制设计封装对话框。如图所示: 参数和对话框…...
【C++】class的设计与使用(十)重载iostream运算符
希望对某个类对象进行读写操作,直接cout<<类对象<<endl;或cin>>类对象;编译器会报错,所以我们必须提供一份重载的input/output运算符: 重载ostream运算符 ostream& operator<<(ostream &os, const Triangu…...
Java使用Scanner类实现用户输入与交互
概述: Scanner类是Java中的一个重要工具类,用于读取用户的输入。它提供了一系列的方法,可以方便地读取不同类型的数据,如整数、浮点数、字符串等。在本文中,我们将详细介绍Scanner类的使用方法,并通过两个…...
FFmpeg 命令:从入门到精通 | ffppeg 命令参数说明
FFmpeg 命令:从入门到精通 | ffmpeg 命令参数说明 FFmpeg 命令:从入门到精通 | ffmpeg 命令参数说明主要参数音频参数视频参数更多参考 FFmpeg 命令:从入门到精通 | ffmpeg 命令参数说明 本节主要介绍了 ffmpeg 命令的常用参数。 主要参数 …...

Chrome(谷歌浏览器)如何关闭搜索栏历史记录
目录 问题描述解决方法插件解决(亲测有效)自带设置解决步骤首先打开 地址 输入:chrome://flags关闭浏览器,重新打开Chrome 发现 已经正常 问题描述 Chrome是大家熟知的浏览器,但是搜索栏的历史记录如何自己一条条的删…...

基于Java的宠物医院管理系统设计与实现(源码+lw+部署文档+讲解等)
文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...