当前位置: 首页 > news >正文

Python中的Numpy向量计算(R与Python系列第三篇)

目录

一、什么是Numpy?

二、如何导入NumPy?

三、生成NumPy数组

3.1利用序列生成

3.2使用特定函数生成NumPy数组

(1)使用np.arange()

(2)使用np.linspace()

四、NumPy数组的其他常用函数

(1)np.zeros()

(2)np.ones()

五、N维数组的属性

1.NumPy数组的物理内存和逻辑视图

2.ndim属性

 3.shape属性

​六、NumPy数组中的运算

0.背景

1.数组向量运算

 2.张量点乘运算

方法一:将二维数组转换为矩阵

方法二:使用张量点乘运算函数dot()

3.NumPy中提供的一些其他常用函数

参考:


说明:本文主要参考《Python极简讲义:一本书入门数据分析与机器学习》(2020年4月出版,电子工业出版社),本文图也是来源于这本书。

仅供学习使用。

R与Python系列第三篇,实际上内容全是Python的内容,跟R没有一点关系,只不过是本人学习Python的第三篇文章,想将R与Python结合使用。当在RStudio中配置好Python环境后(可以看R与Python系列第一篇),Python的代码可以在RStudio中运行,在RStudio的console中>>>表示此时运行的是Python代码,>表示运行R代码。

一、什么是Numpy?

在机器学习算法中,经常会用到数组和矩阵(向量)运算。NumPy是Python的基础,更是数据科学的通用语言,而且与TensorFlow关系密切。

为什么NumPy如此重要?实际上Python本身含有列表(list)和数组(array),但对于大数据来说,这些结构有很多不足。

  • 虽然Python中提供了列表,它可以当作数组使用。但是列表中的元素可以是任意“大杂烩”对象,因此为了区分彼此,列表付出了额外的代价----保存列表中每个对象的指针。这样一来,为了保存一个简单的列表,如[1,2,3,4],Python就不得不配备四个指针,指向四个整数对象。也就是说是,Python不仅要保存对象1,2,3,4的内容,还要保存四个指针,增加了内存成本,是一种低效的行为。
  • Python中也提供了数组,但是它仅仅支持一维数组,不支持多维数组,也没有各种运算函数,因此不适合数值运算。
  • 为了弥补Python数值计算的不足,Jim Hugunin、Travis Oliphant等人联合开发了NumPy项目,NumPy是Python语言的一个扩展程序库,是Numerical Python的简称它提供了两种基本的对象: ndarray(N-dimensional array object)和ufunc(universal function object)。ndarray是存储单一数据类型的多维数组,而ufunc则是可以对数组进行处理的函数。NumPy支持多维度的数组(即N维数组对象ndarray)与矩阵运算,并对数组运算提供了大量的数学函数库。NumPy功能非常强大,支持广播、线性代数运算、傅里叶变换、随机数生成等功能,对很多第三方库(如SciPy、Pandas等)提供了底层支持。

二、如何导入NumPy?

NumPy是Python的外部库。由于Anaconda提供了“全家桶”式的服务,因此在安装Anaconda时,NumPy这个常用的第三方库也被默认安装了。但在使用时,NumPy还是需要显示导入的。使用外部库时,为了方便,我们常会为NumPy起一个别名,通常这个别名为np。

import numpy as np       #导入NumPy并制定别名
print(np.__version__)      #输出其版本号

我们可以使用np.__version__(注意:version前后都是两个下划线)输出NumPy的版本号,这句代码的附属目的是验证NumPy是否被正确加载。如果能正常显示版本号,则说明一切正常,我们可以开始如下的操作了。

三、生成NumPy数组

NumPy最重要的一个特点就是支持N维数组对象ndarray。ndarray对象与列表有相似之处,但也有显著区别。例如,构成列表的元素是大杂烩的,元素类型可以是字符串、字典、元组中的一种或多种,但是NumPy数组中的元素类型要求一致。

3.1利用序列生成

使用array()生成NumPy数组,array()可以接收任意数据类型(如列表、元组等)作为数据源。

如果构造NumPy数组的数据精度不一致,如有整数,也有浮点数,NumPy会自动把所有数据都转换为浮点数,这是因为浮点数的精度更高。

data1 <- [6, 8.5, 9, 0]
arr1 <- np.array(data1)
arr1
输出: array( [6., 8.5, 9., 0.] )

每个数组都有一个dtype属性,用来描述数组的数据类型。除非显示指定,否则np.array会自动推断数据类型。数据类型会被存储在一个特殊的元数据dtype中。

arr1.dtype                   #默认保存为双精度(64 bit)浮点数
输出:dtype('float64') 

如果数据序列是嵌套的,且嵌套序列是等长的,则通过array()方法可以把嵌套的序列转为与嵌套级别适配的高维数组。

data2 = [ [1, 2, 3, 4], [5, 6, 7, 8] ]     #这是一个两层嵌套列表
arr2 = np.array(data2)                     #转换为一个二维数组
arr2输出:
array([[1, 2, 3, 4],[5, 6, 7, 8] ])

3.2使用特定函数生成NumPy数组

(1)使用np.arange()

arange(start, stop, step, dtype)

描述:arange()根据start与stop指定的范围及step设定的步长,生成一个ndarray对象,即一个数组,不仅可以直接输出,还可以当作向量,参与到实际运算当中。取值区间是左闭右开的,即stop这个终止值是不包括在内的。

start:起始值,默认为0;

stop:终止值;

step:步长,如果不指定,默认值为1;

dtype:指定返回ndarray的数据类型,如果没有提供,则会使用输入数据的类型。

arr3 = np.arange(10)     #生成0~9的ndarray数组
print(arr3)
输出:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

ndarray对象可以做运算,如

arr3 = arr3 + 1      #将arr3中每个元素都加1
arr3
输出:
array( [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] ) 

需要说明的是,上述arr3是一个包含10个元素的向量[0,1,2,3,4,5,6,7,8,9],它和标量“1”实施相加操作,原本在向量“尺寸”上是不适配的。之所以能成功实施,是因为利用了“广播”机制。广播机制将这个标量“1”扩展为等长的向量[1,1,1,1,1,1,1,1,1],此时二者的维度是一样的,这才对两个长度不相等的向量进行了相加,这一点和R是一样的。

(2)使用np.linspace()

使用np.linspace()指定区间内生成指定个数的数组。(当然,也可以使用np.arange(),但是需要手动计算函数所需的步长)。

c = np.linspace(1, 10, 20)
c输出:
array([ 1.        ,  1.47368421,  1.94736842,  2.42105263,  2.89473684,3.36842105,  3.84210526,  4.31578947,  4.78947368,  5.26315789,5.73684211,  6.21052632,  6.68421053,  7.15789474,  7.63157895,8.10526316,  8.57894737,  9.05263158,  9.52631579, 10.        ])

上述代码使用np.linspace()在区间[1,10]中生成了20个等间隔的数据,该方法的前两个参数分别指明生成元素的左右区间边界,第三个参数确定上下限之间均匀等分的数据个数。

需要注意的是,np.arange()中数据区间是左闭右开的(即区间的最后一个数值是取不到的),而np.linspace()生成的数据区间是闭区间。当然可以指定np.linspace()中的参数endpoint=False,使生成数据区间编程左闭右开区间。

四、NumPy数组的其他常用函数

(1)np.zeros()

np.zeros()、np.ones()函数用来生成指定维数和填充固定数值的数组。其中,np.zeros()函数生成的数组由0来填充,np.ones()生成的数组由1来填充。它们通常用来对某些变量进行初始化。

>>> zeros = np.zeros((3,4))     #生成3X4的二维数组,元素均为0
>>> zeros
array([[0., 0., 0., 0.],[0., 0., 0., 0.],[0., 0., 0., 0.]])

值得注意的是,np.zeros((3,4))的含义。尺寸参数3和4使用两层括号包裹,实际上,应该将(3,4)整体看作是一个匿名元组对象,np.zeros((3,4))等价于np.zeros(shape=(3,4)),在shape参数处需要通过一个元组或者列表来指明生成数组的尺寸。

元组的外部轮廓是两个圆括号,那么在默认指定shape参数的情况下,那么在默认指定shape参数的情况下,这对圆括号就会和np.zeros()方法的外层括号相连,造成一定程度上的理解困扰,为此,推荐np.zeros( shape = [3,4] ),即将方括号作为轮廓特征的列表 来表示数组的尺寸。(元组的外部轮廓特征是两个圆括号,列表的外部轮廓特征是方括号。)

(2)np.ones()

类似地,可以用np.ones()生成指定尺寸、元素全为1的数组:

>>> ones_ = np.ones(shape = [3,4], dtype =float)
>>> ones_
array([[1., 1., 1., 1.],[1., 1., 1., 1.],[1., 1., 1., 1.]])

(3).reshape() 重构数组尺寸

>>> arr = np.arange(6)         #创建一个一维数组,数组元素为0,1,...,5
>>> arr = arr.reshape((2,3))   #将arr的尺寸重构为两行三列
>>> arr
array([[0, 1, 2],[3, 4, 5]])

注意,reshape()内参数(2,3)的类型是元组,表示数组为两行三列的。

五、N维数组的属性

1.NumPy数组的物理内存和逻辑视图

需要说明的是,在物理内存中是不存在N维数组的,限于存储介质的物理特性,它永远只有一维结构。我们常见的便于理解的N维数组仅仅是“逻辑视图”,它们不过是包装出来的。NumPy数组的物理内存和逻辑视图如下图所示,“编译器”或第三方工具在幕后做了很多额外的工作,这才使得我们享受到了便利。(大致了解一下即可。)

2.ndim属性

N维数组是包含同类型的数据容器,每个数组的维度(dimension)都是由一个ndim属性来描述。

使用.ndim来查看数组的维度

  • 一维数组,是由一个维度构成,.ndim=1, 有时候,一维数组也被称为1D张量(1D Tensor)。
  • 二维数组,是由两个维度构成,.ndim=2,行和列,有时候,二维数组也被称为2D张量(2D Tensor)。
  • 三维数组,是由三个维度构成,.ndim=3,通道、行和列(或者可以记为 页,行 ,列,其中页表示书的一页,这只是为了便于记忆,没啥实质内容。)
  • 以此类推。。。
>>> mp_array = np.arange(0,10)  #创建一个一维数组
>>> mp_array.ndim
1

 3.shape属性

对于N维数组,shape(数组的形状)主要用来表示数组每个维度的数量,一维数组的shape就是它的长度。

 使用.shpae查看形状属性。

>>> mp_array.shape      #查看数组的形状信息
(10,)

NumPy数组形状并不是一成不变的,可以通过reshape()方法将原有数组进行“重构”(变形reshape)。

>>> b = np.arange(15)  #创建一个包含15个元素的一维数组
>>> b
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])
>>> b = b.reshape(3,5)  #改变数组形状为3行5列
>>> b
array([[ 0,  1,  2,  3,  4],[ 5,  6,  7,  8,  9],[10, 11, 12, 13, 14]])
>>> b.ndim  #查看数组的维度信息
2     #这是一个2D张量
>>> b.shape #查看数组的形状信息
(3, 5)
>>> b.size  #查看数组元素的总个数
15

三维数组的构建

>>> a = np.arange(30).reshape(2,3,5) #重构数组为2通道3行5列
>>> a
array([[[ 0,  1,  2,  3,  4],[ 5,  6,  7,  8,  9],[10, 11, 12, 13, 14]],[[15, 16, 17, 18, 19],[20, 21, 22, 23, 24],[25, 26, 27, 28, 29]]])

 六、NumPy数组中的运算

0.背景

如果想要让两个列表对应元素相加,除了使用for循环,还可以使用列表推导式来完成这个任务(这里不介绍列表推导式,可以参考1中6.5.1内容。),列表不能直接进行对应元素的相加!而R中是可以直接进行向量化运算,即逐元素运算。

Python中由于NumPy扩展库使得数组可以进行向量化运算,NumPy扩展库是是一个久经考验的数值计算包,NumPy有十分成熟的算数运算函数,我们不需要给出复杂的计算公式,直接调用NumPy的内置函数,即可达到我们的运算目的。

列表是不能直接完成对应元素相加的,而NumPy数组是可以进行逐元素运算的,逐元素实施加、减、乘、除等运算。

事实上,NumPy中数组的运算,都是基于更为基础的算法库---基础线性子程序(basic linear algebra subprograms,简成BLAS)而实现的。BLAS是一个更底层的、高度并行和优化的张量操作程序,通常由Fortran、C语言编写。

1.数组向量运算

向量化运算即对应元素进行运算。要求两个对象的形状(即维数)是一样的。NumPy吸纳了Fortran或MATLAB等语言的优点,只要操作数组的形状(维度)一致,我们就可以很方便地对它们逐元素(element-wise)实施加、减、乘、除、取余、指数运算等操作。

>>> a = np.arange(10) #生成一维ndarray数组,长度为10
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> b =np.linspace(1,10,10)#生成一维ndarray数组,长度为10
>>> b
array([ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.])
>>> a+b #数组加法
array([ 1.,  3.,  5.,  7.,  9., 11., 13., 15., 17., 19.])
>>> a-b #数组减法
array([-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.])
>>> a*b #数组乘法
array([ 0.,  2.,  6., 12., 20., 30., 42., 56., 72., 90.])
>>> a/b#数组除法
array([0.        , 0.5       , 0.66666667, 0.75      , 0.8       ,0.83333333, 0.85714286, 0.875     , 0.88888889, 0.9       ])
>>> a%b #数组取余
array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
>>> a**2 #数组元素平方
array([ 0,  1,  4,  9, 16, 25, 36, 49, 64, 81])

 2.张量点乘运算

张量点乘运算是指二维数据在数学意义上的矩阵运算,点乘运算这个名称是由NumPy取的。

值得注意的是,二维数组和矩阵本质上是相同地,但是数组默认操作是基于“逐元素”原则的,所以要求两个操作对象之间的维度信息必须是一样的。然而,数学意义上的矩阵乘法不要求两个操作对象之间的维度是一样的,只要求前一个矩阵的列数等于后一个矩阵的行数。

如何执行矩阵的乘法运算?

  • 方法一:将二维数组转换为矩阵;
  • 方法二:使用张量点乘运算,是NumPy给矩阵乘法取得新名称dot(点乘)。

方法一:将二维数组转换为矩阵

>>> a = np.array([[1,2], [3,4]])
>>> a
array([[1, 2],[3, 4]])
>>> a = np.mat(a)  #将数组a转成矩阵a
>>> a
matrix([[1, 2],[3, 4]])>>> b = np.arange(8).reshape(2,4)
>>> b
array([[0, 1, 2, 3],[4, 5, 6, 7]])
>>> b = np.mat(b)  #将数组b转换成矩阵b
>>> b
matrix([[0, 1, 2, 3],[4, 5, 6, 7]])
>>> a*b #此时,矩阵a和矩阵b之间执行的是点乘运算
matrix([[ 8, 11, 14, 17],[16, 23, 30, 37]])

方法二:使用张量点乘运算函数dot()

>>> a     #是矩阵形式
matrix([[1, 2],[3, 4]])
>>> a.A   #.A表示 将矩阵a变换成 二维数组
array([[1, 2],[3, 4]])
>>> b.A   #.A表示 将矩阵b变换成 二维数组
array([[0, 1, 2, 3],[4, 5, 6, 7]])#执行矩阵乘法运算--Numpy又称其为点乘运算
>>> np.dot(a.A, b.A)
array([[ 8, 11, 14, 17],[16, 23, 30, 37]])
>>> a.A @ b.A
array([[ 8, 11, 14, 17],[16, 23, 30, 37]])

说明:np.dot()函数可以在两个元素之间用@符号代替,即a@b结果和np.dot(a,b)是一样的。使用a@b这样更简便一些。

3.NumPy中提供的一些其他常用函数

  • 统计函数:sum() 、min()、 max()、 median()、 mean()、 average()、 std()、 var()分别用于求和、求最小值、求最大值、求中位数、求平均数、求加权平均数、求标准差、求方差。
  • 数学函数:三角函数sin() 、cos() 、tan()等。
  • NumPy提供的函数远不止于此,如果想要娴熟运用它,多查询NumPy的官方帮助文件。

参考:

Python极简讲义:一本书入门数据分析与机器学习》(2020年4月出版,电子工业出版社)(这本书对介绍Numpy写的很详细,非常详细,我觉得初学者只看这一本书,就可以完全理解和掌握NumPy相关知识,强烈推荐阅读!本文大部分内容来源于这本书。)

《Python深度学习:基于TensorFlow》(2018年9月,机工社)(个人认为相对来说,这本书没有上一本更适合Python小白,很多地方的理解需要依靠第一本书的介绍。但是这本书语言使用上比较专业。)

相关文章:

Python中的Numpy向量计算(R与Python系列第三篇)

目录 一、什么是Numpy? 二、如何导入NumPy? 三、生成NumPy数组 3.1利用序列生成 3.2使用特定函数生成NumPy数组 &#xff08;1&#xff09;使用np.arange() &#xff08;2&#xff09;使用np.linspace() 四、NumPy数组的其他常用函数 &#xff08;1&#xff09;np.z…...

LeetCode刷题笔记【27】:贪心算法专题-5(无重叠区间、划分字母区间、合并区间)

文章目录 前置知识435. 无重叠区间题目描述参考<452. 用最少数量的箭引爆气球>, 间接求解直接求"重叠区间数量" 763.划分字母区间题目描述贪心 - 建立"最后一个当前字母"数组优化marker创建的过程 56. 合并区间题目描述解题思路代码① 如果有重合就合…...

nvidia-smi 命令详解

nvidia-smi 命令详解 1. nvidia-smi 面板解析2. 显存与GPU的区别 Reference: nvidia-smi命令详解 相关文章&#xff1a; nvidia-smi nvcc -V 及 CUDA、cuDNN 安装 nvidia-smi(NVIDIA System Management Interface) 是一种命令行实用程序&#xff0c;用于监控和管理 NVIDIA G…...

fork()函数的返回值

在程序中&#xff0c;int pd fork() 是一个典型的 fork() 调用。fork() 函数会创建一个新的进程&#xff0c;然后在父进程中返回子进程的进程ID&#xff08;PID&#xff09;&#xff0c;在子进程中返回0。所以 pd 的值会根据当前进程是父进程还是子进程而有所不同&#xff1a;…...

Stable Diffusion WebUI挂VPN不能跑图解决办法(Windows)

如何解决SD在打开VPN的状态不能运行的问题 在我们开VPN的时候会出现无法生成图片&#xff0c;也无法做其他任何事&#xff0c;这个时候是不是很着急呢&#xff1f; 别急&#xff0c;我这里会说明如何解决。 就像这样&#xff0c;运行半天生成不了图&#xff0c;有时还会出现…...

Android的本地数据

何为本地&#xff0c;即写完之后除非手动修改&#xff0c;否像嘎了一样在那固定死了 有些需求可能也会要求我们去写死数据&#xff0c;因为这需求是一成不变的&#xff0c;那么你通常会用什么方法写死呢&#xff1f; 1. 本地存储-SharedPreferences 此方法可以长时间保存于手…...

android NDK 开发包,网盘下载,不限速

记录下ndk 开发包的地址&#xff0c;分享给大家。 另外有Android studio的下载包&#xff0c; 在另一篇文章 链接&#xff1a;http://t.csdn.cn/JSr9x Android Studio.exe 下载 2023 最新更新&#xff0c;网盘下载_hsj-obj的博客-CSDN博客 主要是19-25&#xff0c;其他的没有…...

【每日一题Day320】LC2651计算列车到站时间 | 数学

计算列车到站时间【LC2651】](https://leetcode.cn/problems/calculate-delayed-arrival-time/) 给你一个正整数 arrivalTime 表示列车正点到站的时间&#xff08;单位&#xff1a;小时&#xff09;&#xff0c;另给你一个正整数 delayedTime 表示列车延误的小时数。 返回列车实…...

C语言柔性数组详解:让你的程序更灵活

柔性数组 一、前言二、柔性数组的用法三、柔性数组的内存分布四、柔性数组的优势五、总结 一、前言 仔细观察下面的代码&#xff0c;有没有看出哪里不对劲&#xff1f; struct S {int i;double d;char c;int arr[]; };还有另外一种写法&#xff1a; struct S {int i;double …...

Redis-带你深入学习数据类型list

目录 1、list列表 2、list相关命令 2.1、添加相关命令&#xff1a;rpush、lpush、linsert 2.2、查找相关命令&#xff1a;lrange、lindex、llen 2.3、删除相关命令&#xff1a;lpop、rpop、lrem、ltrim 2.4、修改相关命令&#xff1a;lset 2.5、阻塞相关命令&#xff1a…...

react拖拽依赖库react-dnd

注&#xff1a;对于表格自定义行可以拖拽和树自定义节点可以拖拽等比较适用&#xff0c;其余的拖拽处理可以使用dragstart&#xff0c;drop等js原生事件来实现 react-dnd使用方法很简单&#xff0c;直接上干货 第一步安装依赖并引入 import { DndProvider } from react-dnd;…...

win10环境安装使用docker-maxwell

目的&#xff1a;maxwell可以监控mysql数据变化&#xff0c;并同步到kafka、mq或tcp等。 maxwell和canal区别&#xff1a; maxwell更轻量&#xff0c;canal把表结构也输出了 docker bootstrap可导出历史数据&#xff0c;canal不能 环境 &#xff1a;win10&#xff0c;mysql5…...

Docker部署RabbitMQ

Docker部署RabbitMQ 介绍 RabbitMQ是一个开源的消息队列系统&#xff0c;它被设计用于在应用程序之间传递消息。它采用了AMQP&#xff08;高级消息队列协议&#xff09;作为底层通信协议&#xff0c;这使得它能够在不同的应用程序之间进行可靠的消息传递。 那么&#xff0c;…...

23个react常见问题

1、setState 是异步还是同步&#xff1f; 合成事件中是异步 钩子函数中的是异步 原生事件中是同步 setTimeout中是同步 相关链接&#xff1a;你真的理解setState吗&#xff1f;&#xff1a; 2、聊聊 react16.4 的生命周期 图片 相关连接&#xff1a;React 生命周期 我对 Reac…...

【python基础】——Anaconda下包更新的坑及安装与卸载、及安装后Jupyter Notebook没反应的解决方法

文章目录 前言一、起因:如何一步步走到卸载重装anaconda?二、卸载anaconda二、重新安装anaconda三、关于安装Anaconda后,打开Jupyter Notebook运行代码没反应且in[ ]没有*前言 本文主要用来记录自己近期踩坑的一些复盘。其中坑有: ‘.supxlabel’ 不起作用的解决pip list 与…...

CSS 中的 display 和 visibility

CSS 中的 display 和 visibility 都可以设置一个元素在浏览器中的显示或隐藏效果。 display: 隐藏某个元素时&#xff0c;不会占用任何空间。换句话讲&#xff0c;不会影响布局。visibility: 隐藏某个元素时&#xff0c;仍需占用与未隐藏之前一样的空间。换句话讲&#xff0c;…...

解决mysql报错this is incompatible with DISTINCT

环境 centos 9 php7.4 mysql5.7 问题 mysql查询报如下错误&#xff1a; SQLSTATE[HY000]: General error: 3065 Expression #1 of ORDER BY clause is not in SELECT list, references column hst_csc.q.timestamp which is not in SELECT list; this is incompatible with…...

C++-map和set

本期我们来学习map和set 目录 关联式容器 键值对 pair 树形结构的关联式容器 set multiset map multimap 关联式容器 我们已经接触过 STL 中的部分容器&#xff0c;比如&#xff1a; vector 、 list 、 deque 、forward_list(C11)等&#xff0c;这些容器统称为序列式…...

微信小程序AI类目-深度合成-AI问答/AI绘画 互联网信息服务算法备案审核通过教程

近期小程序审核规则变化后&#xff0c;很多使用人类小徐提供的chatGPT系统的会员上传小程序无法通过审核&#xff0c;一直提示需要增加深度合成-AI问答、深度合成-AI绘画类目&#xff0c;该类目需要提供互联网信息服务算法备案并上传资质&#xff0c;一般对企业来说这种务很难实…...

蓝桥杯官网练习题(星期一)

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 整个 2020 世纪&#xff08;1901 年 1 月 1 日至 2000 年 12 月 3131 日之间&#xff09;&#xff0c;一共有多少个星期一&#xff1f;(不要告诉我你不知道今天是星…...

centos7更新podman

实验环境&#xff1a;centos7.7.1908 1.安装podman并查看版本 yum install podman podman -v 当前podman版本信息是1.6.4 2.更新podman版本 通过查看资料显示centos 7 支持最高版本为 3.4.4&#xff0c;更新podman大致有以下四步&#xff1a; golang 安装(本次使用版本: 1.…...

Java特性之设计模式【抽象工厂模式】

一、抽象工厂模式 概述 抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式 在抽象工厂模式中&#xff0c;接口是…...

机器学习简介

引言 为何现在机器学习如此热门&#xff1f; 主要原因是由于“人类无论如何也做不到在短时间内实现从大量的数据中自动的计算出正确的结果操作”。 什么是机器学习&#xff1f; 所谓的机器学习&#xff0c;就是通过对数据进行反复的学习&#xff0c;来找出其中潜藏的规律和模式…...

linux之perf(2)list事件

Linux之perf(2)list事件 Author&#xff1a;Onceday Date&#xff1a;2023年9月3日 漫漫长路&#xff0c;才刚刚开始… 参考文档: Tutorial - Perf Wiki (kernel.org)perf-list(1) - Linux manual page (man7.org) 1. 概述 perf list用于列出可用的性能事件&#xff0c;这…...

将多个EXCEL 合并一个EXCEL多个sheet

合并老版本xls using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using NPOI.HSSF.UserModel; …...

【送书活动】揭秘分布式文件系统大规模元数据管理机制——以Alluxio文件系统为例

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…...

微信小程序——数据绑定

在微信小程序中&#xff0c;可以通过以下代码实现数据绑定&#xff1a; 在WXML中&#xff0c;使用双大括号{{}}绑定数据&#xff0c;将数据渲染到对应的视图中。 <view>{{message}}</view>在JS中&#xff0c;定义一个数据对象&#xff0c;并将其绑定到页面的data…...

libbpf-bootstrap安卓aarch64适配交叉编译

1.为什么移植 疑惑 起初我也认为&#xff0c;像libbpf-bootstrap这样在ebpf程序开发中很常用的框架&#xff0c;理应支持不同架构的交叉编译。尤其是向内核态的ebpf程序本身就是直接通过clang的-target btf直接生成字节码&#xff0c;各个内核上的ebpf虚拟机大同小异&#xf…...

【剑指Offer】24.反转链表

题目 定义一个函数&#xff0c;输入一个链表的头节点&#xff0c;反转该链表并输出反转后链表的头节点。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL限制&#xff1a; 0 < 节点个数 < 5000 解答 源代码 /*** Defin…...

04-docker compose容器编排

Docker Compose简介 Docker Compose是什么 ​ Compose 是Docker公司推出的一个工具软件&#xff0c;可以管理多个Dokcer容器组成一个应用。你需要定义一个YAML格式的配置文件 docker-compose.yml&#xff0c;写好多个容器之间的调用关系。然后&#xff0c;只要一个命令&#…...

网站设计大公司/西安网站优化培训

本质上&#xff0c;webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时&#xff0c;它会递归地构建一个依赖关系图(dependency graph)&#xff0c;其中包含应用程序需要的每个模块&#xff0c;然后将所有这些模块打包成一个或…...

自己服务器可以做网站/近期的重大新闻

RPA10.0该如何用&#xff0c;今天艺赛旗的工程师就手把手教您做一个**本教程只针对有并能够使用金蝶 Kis 应用的人员使用&#xff0c;艺赛旗设计器 10.0 版本及以上&#xff1b;第一步&#xff1a;开发流程中所需字段, 变量说明第二步&#xff1a;新建全局变量&#xff0c;运行…...

新疆克拉玛依区建设局网站/网站关键词优化排名技巧

会议地点&#xff1a;宿舍 解决问题&#xff1a;失物招领界面获取信息成功&#xff0c;对于从bmob云数据库表中获取信息&#xff0c;首先要进行关键字的查询&#xff0c;在做出提取之后放入结果数组中&#xff0c;利用for循环&#xff0c;将每一个不同的数组输出 今日任务&…...

wordpress app 开发教程/论文关键词

题意&#xff1a;给定数列&#xff0c;要求每次找到最小的数&#xff0c;输出是第几个&#xff0c;将其本身连同左边翻转&#xff0c;然后删除这个数。如果最小的数不止一个&#xff0c;则取元数列中靠前的那个。 分析&#xff1a;要注意边界情况&#xff0c;以及孩子为0的情况…...

游民星空是用什么做的网站/武汉电脑培训学校有哪些

由于博主主要使用Chrome内核的浏览器进行博客页面的代码优化&#xff0c;因此有些功能可能会因为浏览器的差异而无法正常运行&#xff0c;博主对此也非常无奈啊&#xff1a;Windows的IE浏览器的兼容性实在是太差了...... 尽管如此&#xff0c;考虑到广大使用IE等浏览器的用户&a…...

爱写作网站/宁波seo链接优化

题意&#xff1a;n*m方格&#xff0c;有些格子有黑点&#xff0c;问你最多裁处几张2 * 3&#xff08;3 * 2&#xff09;的无黑点格子。 思路&#xff1a;我们放置2 * 3格子时可以把状态压缩到三进制&#xff1a; 关于状压&#xff1a;POJ-1038 Bugs Integrated, Inc. &#xff…...