深度学习基础:Numpy 数组包

数组基础

在使用导入 Numpy 时,通常给其一个别名 “np”,即 import numpy as np

数据类型

整数类型数组与浮点类型数组

为了克服列表的缺点,一个 Numpy 数组只容纳一种数据类型,以节约内存。为方便起见,可将 Numpy 数组简单分为整数类型数组与浮点型数组

在这里插入图片描述

输出:

在这里插入图片描述

注意这个区别非常重要,不能忽视。

另外使用 print 输出 Numpy 数组后,元素之间没有逗号,这有两个好处,一是可以可将之与 Python 列表区分开来,二是可以避免逗号与小数点之间的混淆。

同化定理

一个人的力量是无法改变全体的,在实际操作中要注意:

1、往整数类型数组里插入浮点数,该浮点数会自动被截断为整数。
2、往浮点数类型数组里插入整数,该整数会自动升级为浮点数。

在这里插入图片描述

输出:

在这里插入图片描述

共同改变定理

同化定理告诉我们,整数型数组和浮点型数组之间的界限非常严格,那么如何将这两种数据类型的数组进行相互转化呢?既然某一个人容易被集体所同化,那只要全体共同改变,自然就可以成功。

整数型数组和浮点型数组相互转换,规范的方法是使用 .astype() 方法

在这里插入图片描述

输出:

在这里插入图片描述

除了上述方法以外,只要满足共同改变定理,整数型数组和浮点型数组仍然可以互相转换。最常见的是整数型数组在运算过程中升级为浮点型数组,示例如下。

在这里插入图片描述

输出:

在这里插入图片描述

整数型数组很好升级浮点型数组,但浮点型数组在运算过程中一般不会降级。

数组维度

一维维度和二维数组

考虑到深度学习中三维及其以上的数组出现次数少,我们后续主要讲解 Numpy 中的一维数组和二维数组,学了一维和二维后,很好类推到三维。

不同维度的数组之间,从外形上的本质区别是:

一维数组使用 1 层中括号表示;
二维数组使用 2 层中括号表示;
三维数组使用 3 层中括号表示。

有些函数需要传入数组的形状参数,不同维度数组的形状参数为:

一维数组的形状参数形如:x 或 (x, );
二维数组的形状参数形如:(x, y);
三维数组的形状参数形如:(x, y, z)。

现在以同一个序列进行举例:

当数组有一层中括号,如 [1 2 3],则其为一维数组,其形状是 3 或 (3, );
当数组有两层中括号,如 [ [1 2 3] ],则其为二维数组,其形状是 (1, 3);
当数组有三层中括号,如 [ [ [1 2 3] ] ],则其为三维数组,其形状是 (1, 1, 3)。

这里用一个后面要讲的 np.ones() 函数进行演示,只因其刚好符合需要传入参数的形状。

在这里插入图片描述

输出:

在这里插入图片描述

平时可以随时留意一下数组的维度(通过中括号的数量),后面有些函数(比如数组的拼接函数)需要两个数组是同维度的。

不同维度数组之间的转换

不管一维数组转二维数组,还是二维数组转一维数组,都要使用的是数组的重塑方法 .reshape() ,该方法需要传入重塑后的形状(shape)参数。

这个方法神奇的是,给定了其它维度的数值,剩下一个维度可以填 -1,让它自己去计算。比如把一个 5 行 6 列的矩阵重塑为 3 行 10 列的矩阵,当列的参数 10 告诉它,行的参数直接可以用 -1 来替代,它会自动去用 30 除以 10 来计算。

演示将一维数组升级为二维数组:

在这里插入图片描述

输出:

在这里插入图片描述

这里给 .reshape() 传入的形状参数是 (1, -1) ,正常情况下我们都肯定是 (1, 10),这里 (1, -1) 的含义是:行的参数是 1 行,列的参数是 -1 自己去除着算吧(反过来也是一样的嗷)

接着,演示将二维数组降级为一维数组。

在这里插入图片描述

输出:

在这里插入图片描述

现在规定,本文中将一维数组称为向量,二维数组称为矩阵

数组的创建

创建指定数组

当明确知道数组每一个元素的具体数值时,可以使用 np.array() 函数,将 Python 列表转换为 Numpy 数组

在这里插入图片描述

输出:

在这里插入图片描述

注意:一维向量是最节省内存的,而二维三维会逐渐使内存消耗变大

特别是极端情况如 一万行一列 的这种情况,是非常消耗内存的。

创建递增数组

递增数组使用 np.arange() 函数进行创建(arange 全称是 array_range)。

在这里插入图片描述

输出:

在这里插入图片描述

如果想要创建递增的浮点数数组的化,可以有下面两种技巧:

在这里插入图片描述

输出:

在这里插入图片描述

创建同值数组

需要创建同值数组时,使用 np.zeros() 函数以及 np.ones() 函数,如示例。

在这里插入图片描述

输出:

在这里插入图片描述

示例中隐藏了一个细节,两个函数输出的并不是整数型的数组,这可能是为了避免插进去的浮点数被截断,所以将其设定为浮点型数组

创建随机数组

有时需要创建随机数组,那么可以使用 np.random 系列函数,如示例。

在这里插入图片描述

输出:

在这里插入图片描述

数组的索引

访问数组元素

与 Python 列表一致,访问 Numpy 数组元素时使用中括号,索引由 0 开始。

访问向量

在这里插入图片描述

输出

在这里插入图片描述

访问矩阵

在这里插入图片描述

输出:

在这里插入图片描述

花式索引

在上一小节访问单个元素时,向量用 arr1[x],矩阵用 arr2[x, y] 。逗号在矩阵里用于区分行和列,这一小节逗号新增一个功能,且不会与矩阵里的逗号混淆。

向量的花式索引

在这里插入图片描述

输出:

在这里插入图片描述

矩阵的花式索引

在这里插入图片描述

输出:

在这里插入图片描述

根据以上示例,花式索引也就是用向量来替代普通索引的行列元素,且花式索引输出的仍然是一个向量

普通索引用一层中括号,而花式索引使用两层中括号。

访问数组切片

向量的切片

向量与列表切片的操作完全一致,因此本页内容在 Python 基础中均有涉及。

在这里插入图片描述

在这里插入图片描述

输出:

在这里插入图片描述

矩阵的切片

在这里插入图片描述

输出:

在这里插入图片描述

提取矩阵的行

基于矩阵的切片功能,我们可以提取其部分行。

在这里插入图片描述

输出:

在这里插入图片描述

所以有时可能会看到诸如 arr[1][2] 这样的语法,不必吃惊,其实这只是先提取了第一行,再提取该行中第二个元素。BTW,这样的简便写法并不推荐,最好规范的写

提取矩阵的列

基于矩阵的切片功能,我们可以提取其部分列。

在这里插入图片描述

输出:

在这里插入图片描述

实际上也可以直接使用 reshape 进行矩阵列的提取,这里只是介绍一下转置操作在 Numpy 中的用法。

数组切片仅是视图

数组切片仅仅只是视图

与 Python 列表和 Matlab 不同,Numpy 数组的切片仅仅是原数组的一个视图。换言之,Numpy 切片并不会创建新的变量。

在这里插入图片描述

输出:

在这里插入图片描述

如果一个几百万条数据的数组,每次切片时都创建一个新变量,势必造成大量的内存浪费。因此,Numpy的切片被设计为原数组的视图是极好的。

深度学习中为了节省内存,将多次使用 arr[:] = <表达式> 来替代 arr = <表达式>

备份切片为新变量

如果真的需要为切片创建新变量(这种情况是很稀少的),使用 .copy() 方法。

在这里插入图片描述

输出:

在这里插入图片描述

数组赋值仅是绑定

数组赋值仅仅是绑定

与 Numpy 数组的切片一样,Numpy 数组完整的赋值给另一个数组,也只是绑定。换言之,Numpy 数组之间的赋值并不会创建新的变量,示例如下。

在这里插入图片描述

输出:

在这里插入图片描述

此特性的出现依然是为了节省内存,破局的方法仍然与前面相同。

复制数组为新变量

如果真的需要赋给一个新数组,使用 .copy() 方法。

在这里插入图片描述

输出:

在这里插入图片描述

数组的变形

数组的转置

数组的转置方法为 .T其只对矩阵有效,因此遇到向量要先将其转化为矩阵

向量的转置

在这里插入图片描述

输出:

在这里插入图片描述

矩阵的转置

行矩阵的转置刚演示了,列矩阵的转置如示例所示。

在这里插入图片描述

输出:

在这里插入图片描述

矩阵的转置如示例所示。

在这里插入图片描述

输出:

在这里插入图片描述

数组的翻转

数组的翻转方法有两个,一个是上下翻转的 np.flipud( ) ,表示 up-down;一个是左右翻转的 np.fliplr( ),表示 left-right。其中,向量只能使用 np.flipud( ),在数学中,向量并不是横着排的,而是竖着排的

向量的翻转

在这里插入图片描述

输出:

在这里插入图片描述

矩阵的翻转

在这里插入图片描述

输出:

在这里插入图片描述

数组的重塑

想要重塑数组的形状,需要用到 .reshape( ) 方法。

前面说过,给定了其他维度的数值,剩下一个维度可以填-1,让它自己去计算。比如把一个 5 行 6 列的矩阵重塑为 3 行 10 列的矩阵,当列的参数 10 告诉它,行的参数直接可以用-1 来替代,它会自己去用 30 除以 10 来计算。

向量的变形

在这里插入图片描述

输出:

在这里插入图片描述

矩阵的变形

在这里插入图片描述

输出:

在这里插入图片描述

数组的拼接

向量的拼接

两个向量拼接,将得到一个新的加长版向量。

在这里插入图片描述

输出:

在这里插入图片描述

矩阵的拼接

两个矩阵可以按不同的维度进行拼接,但拼接时必须注意维度的吻合。

在这里插入图片描述

输出:

在这里插入图片描述

最后要说明的是,向量和矩阵不能进行拼接,必须先把向量升级为矩阵

数组的分裂

向量的分裂

向量分裂,将得到若干个更短的向量。

在这里插入图片描述

输出:

在这里插入图片描述

np.split() 函数中,给出的第二个参数 [2,8] 表示在索引 [2] 和索引 [8] 的位置截断。

矩阵的分裂

矩阵的分裂同样可以按不同的维度进行,分裂出来的均为矩阵。

在这里插入图片描述

输出:

在这里插入图片描述

数组的运算

数组与系数之间的运算

Python 基础中,常用的运算符如表 5-1 所示,NumPy 的运算符与之相同。

在这里插入图片描述

这里仅以矩阵为例,向量与系数的操作与之相同。

在这里插入图片描述

输出:

在这里插入图片描述

数组与数组之间的运算

同维度数组间的运算即对应元素之间的运算,这里仅以矩阵为例,向量与向量的操作与之相同。

在这里插入图片描述

输出:

在这里插入图片描述

上述乘法运算中,乘法是遵循对应元素相乘的,你可以称之为“逐元素乘积”。

那么如何实现线性代数中的“矩阵级乘法”呢?下一章节会介绍到相关函数。

广播

上一节是同形状数组之间的逐元素运算,本节讲解不同形状的数组之间的运算。

本课件仅讨论二维数组之内的情况,不同形状的数组之间的运算有以下规则:

⚫ 如果是向量与矩阵之间做运算,向量自动升级为行矩阵;

⚫ 如果某矩阵是行矩阵或列矩阵,则其被广播,以适配另一个矩阵的形状。

向量被广播

当一个形状为(x,y)的矩阵与一个向量做运算时,要求该向量的形状必须为 y,运算时向量会自动升级成形状为(1,y)的行矩阵,该形状为(1,y)的行矩阵再自动被广播为形状为(x,y)的矩阵,这样就与另一个矩阵的形状适配了。

在这里插入图片描述

输出:

在这里插入图片描述

列矩阵被广播

当一个形状为(x,y)的矩阵与一个列矩阵做运算时,要求该列矩阵的形状必须为(x,1),该形状为(x,1)的列矩阵再自动被广播为形状为(x,y)的矩阵,这样就与另一个矩阵的形状适配了。

在这里插入图片描述

输出:

在这里插入图片描述

行矩阵与列矩阵同时被广播

当一个形状为(1,y)的行矩阵与一个形状为(x,1) 的列矩阵做运算时,这俩矩阵都会被自动广播为形状为(x,y)的矩阵,这样就互相适配了。

在这里插入图片描述

输出:

在这里插入图片描述

数组的函数

矩阵乘积

⚫ 第五章也就是上一章中的乘法都是“逐元素相乘”,这里介绍线性代数中的矩阵乘积,本节只需要使用 np.dot( ) 函数。

⚫ 当矩阵乘积中混有向量时,根据需求,其可充当行矩阵,也可充当列矩阵,但混有向量时输出结果必为向量。

向量与向量的乘积

设两个向量的形状按前后顺序分别是 5 以及 5 。从矩阵乘法的角度,有(1, 5)x(5, 1) = (1, 1),因此输出的应该是形状为 1 的向量。

在这里插入图片描述

输出:

在这里插入图片描述

向量与矩阵的乘积

设向量的形状是 5,矩阵的形状是 (5,3) 。从矩阵乘法的角度,有(1,5)x(5,3)=(1,3),因此输出的应该是形状为 3 的向量。

在这里插入图片描述

输出:

在这里插入图片描述

矩阵与向量的乘积

设矩阵的形状是 (3,5) ,向量的形状是 5。从矩阵乘法的角度,有(3,5)x(5,1)=(3,1),因此输出的应该是形状为 3 的向量。

在这里插入图片描述

输出:

在这里插入图片描述

矩阵与矩阵的乘积

设两个矩阵的形状按前后顺序分别是 (5,2) 以及 (2,8) 。从矩阵乘法的角度,有(5,2)x(2,8)=(5,8),因此输出的应该是形状为 (5,8) 的矩阵。

在这里插入图片描述

输出:

在这里插入图片描述

数学函数

NumPy 设计了很多数学函数,这里列举其中最重要、最常见的几个。

在这里插入图片描述

输出:

在这里插入图片描述

聚合函数

聚合很有用,这里用矩阵演示。向量与之一致,但没有 axis 参数。以下在注释中介绍了 6 个最重要的聚合函数,其用法完全一致,仅演示其中 3 个。

在这里插入图片描述

输出:

在这里插入图片描述

⚫ 当 axis=0 时,最终结果与每一行的元素个数一致;当 axis=1 时,最终结果与每一列的元素个数一致。

⚫ 考虑到大型数组难免有缺失值,以上聚合函数碰到缺失值时会报错,因此出现了聚合函数的安全版本,即计算时忽略缺失值:np.nansum( )、np.nanprod( ) 、np.nanmean( )、np.nanstd( )、np.nanmax( )、np.nanmin( )。

布尔型数组

除了整数型数组和浮点型数组,还有一种有用的数组类型——布尔型数组。

创建布尔型数组

由于 NumPy 的主要数据类型是整数型数组或浮点型数组,因此布尔型数组的产生离不开:大于>、大于等于>=、等于==、不等号!=、小于<、小于等于<=。

首先,我们将数组与系数作比较,以产生布尔型数组,示例如下。

在这里插入图片描述

输出:

在这里插入图片描述

其次,我们将同维数组作比较,以产生布尔型数组,示例如下。

在这里插入图片描述

输出:

在这里插入图片描述

最后,还可以同时比较多个条件。Python 基础里,同时检查多个条件使用的与、或、非是 and、or、not。但 NumPy 中使用的与、或、非是 & 、 | 、 ~ 。

在这里插入图片描述

输出:

在这里插入图片描述

布尔型数组中 True 的数量

有三个关于 Ture 数量的有用函数,分别是 np.sum( )、np.any( )、np.all( )。

np.sum( )函数:统计布尔型数组里 True 的个数。示例如下

在这里插入图片描述

输出:

在这里插入图片描述

在上面的示例中,np.abs(arr) <1 可以替换为 (arr>-1) & (arr<1) 。此外,最终统计的数量为 6790,其概率近似为 0.6827,这符合统计学中的 3σ 准则。

np.any( )函数:只要布尔型数组里含有一个及其以上的 True,就返回 True

在这里插入图片描述

输出:

在这里插入图片描述

从结果来看,arr1 与 arr2 里含有共同元素,那就是 5。

np.all( )函数:当布尔型数组里全是 True 时,才返回 True,示例如下。

在这里插入图片描述

输出:

在这里插入图片描述

从结果来看,尽管 3σ 准则告诉我们有 99.73%的考生成绩高于 290 分(290通过500-3x70计算得到),但仍然有最终成绩低于 250 分的裸考者。

布尔型数组作为掩码

若一个普通数组和一个布尔型数组的维度相同,可以将布尔型数组作为普通数组的掩码,这样可以对普通数组中的元素作筛选。给出两个示例。

第一个示例,筛选出数组中大于、等于或小于某个数字的元素。

在这里插入图片描述

输出:

在这里插入图片描述

注意,这个矩阵进行掩码操作后,退化为了向量。

第二个示例,筛选出数组逐元素比较的结果。

在这里插入图片描述

输出:

在这里插入图片描述

满足条件的元素所在位置

现在我们来思考一种情况:假设一个很长的数组,我想知道满足某个条件的元素们所在的索引位置,此时使用 np.where( ) 函数。

在这里插入图片描述

输出:

在这里插入图片描述

np.where( ) 函数的输出看起来比较怪异,它是输出了一个元组。元组第一个元素是“满足条件的元素所在位置”;第二个元素是数组类型,可忽略掉。

从数组到张量

最后总结一下,PyTorch 作为当前首屈一指的深度学习库,其将 NumPy 的语法尽数吸收,作为自己处理数组的基本语法,且运算速度从使用 CPU 的数组进步到使用 GPU 的张量。

⚫ NumPy 和 PyTorch 的基础语法几乎一致,具体表现为:

① np 对应 torch;
② 数组 array 对应张量 tensor;
③ NumPy 的 n 维数组对应着 PyTorch 的 n 阶张量。

⚫ 数组与张量之间可以相互转换:
数组 arr 转为张量 ts:ts = torch.tensor(arr);
张量 ts 转为数组 arr:arr = np.array(ts)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/799005.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

简洁实用的原创度检测工具AntiPlagiarism NET 4.132

AntiPlagiarism NET是一个适用于Windows的程序&#xff0c;它允许您检查文本的唯一性和从不同Internet来源借用的存在。使用AntiPlagiarism NET&#xff0c;您可以&#xff1a; 将程序用于不同的目的该程序适用于学生、教师、记者、文案作者和其他需要检查其文本或其他作者文本…

FPGA 项目菜单功能比较

为了帮助您更好地理解每个FPGA功能模块的实用场合、区别和特点&#xff0c;以下是详细的比较&#xff1a; 功能模块实用场合区别特点FPGA I/O自动控制系统、数据采集系统直接与FPGA板卡上的物理端口交互&#xff0c;配置和使用外部I/O设备灵活配置输入输出端口&#xff0c;支持…

开放式蓝牙耳机哪家强?五款值得入手的款式推荐!

当前&#xff0c;耳机技术迎来颠覆性飞跃&#xff0c;开放式蓝牙耳机横空出世&#xff0c;以其卓越的音质体验与无可比拟的听力保护优势&#xff0c;重塑了耳机行业的标准。其非入耳设计&#xff0c;既保证了音质的纯粹传达&#xff0c;又有效避免了长时间佩戴对耳朵的潜在伤害…

板级调试小助手(2)ZYNQ自定义IP核构建属于自己的DDS外设

一、前言 在上期文章中讲述了小助手的系统结构和原理。在PYNQ的框架开发中&#xff0c;我们一般可以将PL端当做PS端的一个外设&#xff0c;通过读写寄存器的方式来操作外设的功能&#xff0c;就类似于在开发ARM和DSP中操作外设一样&#xff0c;不同时的是&#xff0c;我们可以通…

AIGC率超标?掌握论文去AI痕迹的高效策略

随着 AI 技术迅猛发展&#xff0c;各种AI辅助论文写作的工具层出不穷&#xff01; 为了防止有人利用AI工具进行论文代写&#xff0c;在最新的学位法中已经明确规定“已经获得学位者&#xff0c;在获得该学位过程中如有人工智能代写等学术不端行为&#xff0c;经学位评定委员会…

智慧公厕系统实现人性化与节能化的完美结合

在当今社会&#xff0c;科技的飞速发展正不断改变着我们的生活方式&#xff0c;公厕也不例外。智慧公厕系统的出现&#xff0c;不仅提升了人们的使用体验&#xff0c;更实现了人性化与节能化的完美结合&#xff0c;为城市公共服务带来了全新的变革。 一、人性化&#xff0c;是智…

清朝嘉庆二十五年(1820年)地图数据

我们在《中国历史行政区划连续变化数据》一文中&#xff0c;为你分享了中国历史行政区划连续变化地图数据。 现在再为你分享清朝嘉庆二十五年&#xff08;1820年&#xff09;的地图数据&#xff0c;该数据对于研究历史的朋友应该比较有用&#xff0c;请在文末查看领取方式。 …

SpringBoot实战:多表联查

1. 保存和更新公寓信息 请求数据的结构 Schema(description "公寓信息") Data public class ApartmentSubmitVo extends ApartmentInfo {Schema(description"公寓配套id")private List<Long> facilityInfoIds;Schema(description"公寓标签i…

深度学习概览

引言 深度学习的定义与背景 深度学习是机器学习的一个子领域&#xff0c;涉及使用多层神经网络分析和学习复杂的数据模式。深度学习的基础可以追溯到20世纪80年代&#xff0c;但真正的发展和广泛应用是在21世纪初。计算能力的提升和大数据的可用性使得深度学习在许多领域取得…

platformIO STM32 upload-“Failed to init device.”问题解决

因为发现自己的32板子有带自动下载功能&#xff0c;platformIO也支持串口下载&#xff0c;但一直提示这个问题 问题情况 问题解决 把BOOT0接3.3V&#xff0c;BOOT1接GND&#xff0c;再点击下载(之后接回去复位也可以显示) 这是我从一个有相同问题的人从他尝试过的解决方案中…

SadTalker数字人服务器部署

一、单独SadTalker部署 git clone https://github.com/OpenTalker/SadTalker.gitcd SadTalker conda create -n sadtalker python3.8conda activate sadtalkerpip install torch1.12.1cu113 torchvision0.13.1cu113 torchaudio0.12.1 --extra-index-url https://download.pyto…

S7-200smart与C#通信

https://www.cnblogs.com/heizao/p/15797382.html C#与PLC通信开发之西门子s7-200 smart_c# s7-200smart通讯库-CSDN博客https://blog.csdn.net/weixin_44455060/article/details/109713121 C#上位机读写西门子S7-200SMART PLC变量 教程_哔哩哔哩_bilibilihttps://www.bilibili…

Windows中安装python/cmd中执行python命令无效

1、问题阐述? 本文章提供非常详细的安装教程。 本文章适合于不会安装python或者安装了python后,在cmd中执行python命令无效的情况。 2、下载python python下载官网地址:Download Python | Python.org 在下面的框子中选择你需要的版本 如果是windows选择如下包 如下版本…

机器人前沿--PalmE:An Embodied Multimodal Language Model 具身多模态大(语言)模型

首先解释这篇工作名称Palm-E&#xff0c;发表时间为2023.03&#xff0c;其中的Palm是谷歌内部在2022.04开发的大语言模型&#xff0c;功能类似ChatGPT&#xff0c;只是由于各种原因没有那样火起来&#xff0c;E是Embodied的首字母&#xff0c;翻译过来就是具身多模态大语言模型…

计算机网络生成树协议介绍与实践

生成树协议 1.环路 二层环路&#xff1a;数据链路层&#xff0c;交换机&#xff08;二层设备&#xff09;通过线路连接环状。即物理成环并且没有开启防环协议。 危害&#xff1a;广播风暴&#xff1a;交换机将未知帧广播&#xff0c;收到后的交换机继续广播&#xff0c;不断…

国产替代正当时,智汇云舟视频孪生加速信创国产化替代

数据安全是国家安全的核心&#xff0c;我国正积极推进计算机软硬件的国产化&#xff0c;以减少对外部技术的依赖&#xff0c;提升国内信息技术产业的竞争力。国产化软硬件的适配不仅能够维护企业机密和客户信任&#xff0c;还能有效防止数据泄露和网络攻击&#xff0c;同时帮助…

vscode编译环境配置-golang

1. 支持跳转 如果单测函数上方不显示run test | debug test&#xff0c;需要安装Code Debugger&#xff08;因为以前的go Test Explorer不再被维护了&#xff09; 2. 单测 指定单个用例测试 go test -v run TestXXXdlv 调试 需要安装匹配的go版本和delve版本&#xff08;如…

OrangePi AIpro在安防领域的深思和实战(旷视科技CNN模型ShuffleNetV1开发案例测试)

一、前言 公司最近有个项目是安防领域的&#xff0c;主要用在边缘结点&#xff0c;虽然已做成形&#xff0c;但是还是存在一些缺陷&#xff0c;例如&#xff1a;算力问题&#xff0c;开发板的成熟问题&#xff0c;已经各种技术的解决方案落地问题。目前我们集成了很多功能&…

MyBatis where标签内嵌foreach标签查询报错‘缺失右括号‘或‘命令未正确结束‘

MyBatis <where>标签内嵌<foreach>标签查询报错’缺失右括号’或’命令未正确结束’ <where>标签内嵌<foreach>标签 截取一段脱敏xml&#xff0c;写明大概意思 <select id"queryLogByIds" resultMap"BaseResultMap">SELE…

巧用 VScode 网页版 IDE 搭建个人笔记知识库!

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] 巧用 VScode 网页版 IDE 搭建个人笔记知识库! 描述&#xff1a;最近自己在腾讯云轻量云服务器中部署了一个使用在线 VScode 搭建部署的个人Markdown在线笔记&#xff0c;考虑到在线 VScode 支持终…