【Python】NumPy(一):数据类型、创建数组及基本操作

目录

​NumPy初识

1.什么是NumPy?

NumPy的应用

NumPy数据类型

Python基本数据类型

NumPy数据类型

NumPy数组

创建数组

1.使用numpy.array() 

2.使用arange()方法创建

3.使用linspace()创建等差数列

4使用zeros()创建数组

5.使用ones()创建数组

6.利用eye()方法创建数组

7.利用rand()创建随机数组

ndarray数组的属性

数组的基本操作

重置形状reshape

数组展开ravel

数组堆叠

数组轴移动moveaxis

数组轴位置交换swapaxes

数组拆分

数组插入insert

数组删除delete

 数组附加append

重设尺寸resize

resize和reshape的区别


NumPy初识

1.什么是NumPy?

NumPy作为数据分析的三剑客之一,是Python中用于科学计算和数据分析的一个开源扩展库,包含了一个强大的N维数组对象和一组函数,可以用来处理各种数组和矩阵运算。NumPy的核心是ndarray对象,是一个功能强大的N维数组对象,封装了n维同类数组,与Python内置的列表相比,NumPy数组的计算速度更快,适合处理大量的数据。

NumPy的应用

NumPy通常与SciPy(算法库)、Pandas(数据分析库)和Matplotlib(绘图库)一起使用。这种组合广泛应用于替代MatLab,进行数据分析或者机器学习。

NumPy数据类型

NumPy支持的数据类型要比Python内置的数据类型要多,基本上可以和C语言的数据类型对应,我们先来回顾一下Python的基本数据类型。

Python基本数据类型

在python中,支持的数字类型有以下5种:

类型

说明
int整型,通常为int32或int64
long仅在Python2中存在
float浮点型 
bool布尔型
complex复数型

NumPy数据类型

NumPy支持的数值类型更多,有以下:

类型说明
bool_布尔型数据类型(True或者False)
int_默认的整数类型(类似C语言中的long,int32或int64)
intc与C的int类型一样,一般是int32或int64
intp用于索引的整数类型(类似C的ssize_t,一般情况下仍然是int32或int64)
int8字节(-128 ~ 127)
int16整数(-32768 ~ 32767)
int32整数(-2147483648 ~ 2147483647)

int64

整数(-9223372036854775808 ~ 9223372036854775807)
uint8无符号整数(0 ~ 255)
unit16无符号整数(0 ~ 65535)
uint32无符号整数(0 ~4294967295)
uint64无符号整数(0 ~18446744073709551615)
float_float64类型的缩写
float16半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位
float32单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位
float64双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位
complex_complex128 类型的简写,即 128 位复数
complex64复数,表示双 32 位浮点数(实数部分和虚数部分)
complex128复数,表示双 64 位浮点数(实数部分和虚数部分)

Numpy的这些数值类型都归于 dtype对象实例中。我们可以用 numpy.dtype(object,align,copy)来指定数据类型。若我们使用array,则可以在创建数组的同时,用 dtype= 参数来指定类型。

我们来看例子:

# 将所需要用到的Numpy导入
import numpy as np
# 利用NumPy中的array来创建数组,同时指定类型为int8
arr = np.array([1,2,3,4],dtype=np.int8)
# 查看数组同时查看类型
print(arr,arr.dtype)
# 如果想更改数组的类型,可以使用变量名.astype(type)
arr=arr.astype('float')
# 查看数组同时查看类型
print(arr,arr.dtype)

如果我们想要更改数组的数据类型,那么我们可以使用 数组名.astype('type') 的方式来更改,同时需要让数组重新接收一下返回的数组。

输出如下:

[1 2 3 4] int8
[1. 2. 3. 4.] float64

NumPy数组

在Numpy中,最核心的一个就是ndarray多维数组对象。区别于Python的标准类,有着处理高维数组的能力,也是数值计算中缺一不可的重要特性。

ndarray类具有以下6个参数:

  • shape:数组的形状;
  • dtype:数据类型;
  • buffer:对象暴露缓存区接口;
  • offset:偏移量;
  • strides:步长;
  • order:{‘C’,‘F’},以行或列为主排列顺序。

创建数组

在NumPy中,创建 ndarray的方式有很多种,这里我们讲下常见的几种

1.使用numpy.array() 

array中的参数:

array(object,dtype=None,copy=True,order=None,subok=False,ndmin=0)

  • object:表示一个数组序列。列表、元组等;
  • dtype:可选参数,通过它可以改变数组的数据类型;
  • copy:可选参数,当数据源是ndarray时,表示数组能否被复制,默认是True。
  • order:可选参数,以哪种内存布局创建数组,有3个可选值:C(行序列)、 F(列序列)、 A(默认);
  • ndmin:可选参数,用于指定数组的维度;
  • subok:可选参数,类型为bool值,默认是False。为True,使用object的内部数类型;False:使用object数组的数据类型。

示例:

# 创建一个一维数组
arr = np.array([1,2,3,4,5])
print('arr:',arr)# 创建一个二维数组
arr2 = np.array([[1,2,3],[4,5,6]
])
print('arr2:',arr2)
#也可以使用元组
arr3 = np.array([(1,2,3,4),(5,6,7,8)
])
print('arr3:',arr3)

结果:

arr: [1 2 3 4 5]
arr2: [[1 2 3][4 5 6]]
arr3: [[1 2 3 4][5 6 7 8]]

2.使用arange()方法创建

除了上述的array(),我们还可以使用arange()方法来创建,

numpy.arange(start,stop,step,dtype)

  •  stop:起始值,默认为0;
  • stop:终止值(不包含)
  • step:步长,即每次+/-的长度,默认1;
  • dtype:返回ndarray的数据类型,如果没提供,会使用输入数据的类型。

示例:

# 若arange中的参数只有一个,说明要生成以步长为1,范围在[0,所给值)的新数组
arr = np.arange(20)
print(arr)
# 新建范围在[10,50),步长为2的新数组
arr1 = np.arange(10,50,2)
print(arr1)

结果:

[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]
[10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48]

3.使用linspace()创建等差数列

linspace和arange一样,都能创建均匀间隔的数组。

linspace(start,stop,num=50,endpoint=True,retstep=False,dtype=None)

  • start:序列的起始值;
  • step:序列的结束值;
  • num:生成的样本数,默认50;
  • endpoint:布尔值,如果为真,则结束值(最后一个值恰好是结束值)也包含在序列中;
  • retstep:布尔值,如果为真,返回间距;
  • dtype:数组的类型。 

示例:

# 生成在1~10 ,总数为10个的数组
arr = np.linspace(1,10,num=10,endpoint=True)
print(arr)
#不包含10
arr = np.linspace(1,10,num=10,endpoint=False)
print(arr)

结果:

[ 1.  2.  3.  4.  5.  6.  7.  8.  9. 10.]
[1.  1.9 2.8 3.7 4.6 5.5 6.4 7.3 8.2 9.1]

4使用zeros()创建数组

利用zeros()方法,我们可以创建一个全部为0的多维数组。

numpy.zeros(shape,dtype=None,order='C')

  • shape:用于指定数组的形状,例如:(2,3)表示创建一个2行3列的全0数组;
  • dtype:数据类型;
  • order:{‘C’,‘F’},按行或者按列存储数组。

示例:

# 新建一个2行3列的全0整型数组,
arr = np.zeros((2,3),'int64')
arr,arr.dtype

结果:

(array([[0, 0, 0],[0, 0, 0]], dtype=int64),dtype('int64'))

5.使用ones()创建数组

与上面的zeros()的参数一致,不过填充的是1。

示例:

# 新建一个2行3列的全1整型数组,
arr = np.ones((2,3),'int64')
arr,arr.dtype

结果:

(array([[1, 1, 1],[1, 1, 1]], dtype=int64),dtype('int64'))

6.利用eye()方法创建数组

numpy.eye() 用于创建一个二维数组,特点是k对角线上的值为1,其余值为0,可以理解为单位矩阵E。

eye(N,M=None,k=0,dtype=<type 'float'>)

  • N:输出数组的行数;
  • M:输出数组的列数;
  • k:对角线索引:0(默认)是主对角线,正值指上对角线,负值表示下对角线。 

示例:

arr = np.eye(4,4)
arr,arr.dtype

结果:

(array([[1., 0., 0., 0.],[0., 1., 0., 0.],[0., 0., 1., 0.],[0., 0., 0., 1.]]),dtype('float64'))

7.利用rand()创建随机数组

在处理一些需要模拟随机数据的情况下,可以使用随机数组。会生成一个具有特点形状和大小的数组。

在NumPy中,random类下有三种方法:

random.rand() :这个函数的参数是数组的维度;

random.randn():这个函数的参数是数组的维度;

random.randint(low,high=None,size=None,dtype='|'):

  • low:随机数最小值;
  • high:随机数的最大值(不包含);
  • size:数组维度;
  • dtype:数据类型,默认int。

示例:

# 生成3行4列的随机数数组
arr = np.random.rand(3,4)
arr,arr.dtype
# 生成4行4列的随机数数组
arr = np.random.randn(4,4)
arr,arr.dtype
# 生成4行4列的随机数数组
arr = np.random.randn(4,4)
arr,arr.dtype

结果:

(array([[0.66930943, 0.6543889 , 0.67554026, 0.95700263],[0.91809325, 0.45346589, 0.14391797, 0.29588364],[0.34052777, 0.38234875, 0.71249733, 0.19030281]]),dtype('float64'))
(array([[ 1.16236082,  0.25761912, -0.69193693, -0.45389874],[ 0.4289053 , -0.33901307,  3.15225338, -0.5902022 ],[ 1.021301  ,  0.22364381,  0.08164906,  0.04529836],[-0.49172765, -0.40732204, -0.97332439,  1.47626338]]),dtype('float64'))
(array([[4, 3, 2, 4, 7],[7, 1, 7, 3, 6],[4, 3, 8, 0, 9],[4, 9, 1, 8, 5]]),dtype('int32'))

ndarray数组的属性

 1.ndarray.ndim:表示数组的秩,一维数组的秩为1,二维数组的秩为2,三维为3,依次类推。

# 创建一个二维数组,reshape用于重新设置数组的形状
arr = np.arange(20).reshape(4,5)
print('arr:',arr)
print('数组的秩为:',arr.ndim)
arr: [[ 0  1  2  3  4][ 5  6  7  8  9][10 11 12 13 14][15 16 17 18 19]]
数组的秩为: 2

2.ndarray.shape :输出数组的形状

依旧用上面的例子:

print('数组的形状:',arr.shape)
数组的形状: (4, 5)

3.ndarray.size:输出数组元素个数

print('数组元素个数:',arr.size)
数组元素个数: 20

4.ndarray.itemsize:输出一个数组元素的字节数.

print('数组元素所占字节:',arr.itemsize)
数组元素所占字节: 4

5.ndarray.real 用来输出数组包含元素的实部。

print('数组的实部为:',arr.real)
数组的实部为: [[ 0  1  2  3  4][ 5  6  7  8  9][10 11 12 13 14][15 16 17 18 19]]

6.ndarray.imag 用来输出数组包含元素的虚部。

print('数组的虚部为:',arr.imag)
数组的实部为: [[ 0  1  2  3  4][ 5  6  7  8  9][10 11 12 13 14][15 16 17 18 19]]

7.ndarray.T用于数组的转值,与.transpose() 相同。

print('转置前:\n',arr)
print('数组转置后:\n',arr.T)
转置前:[[ 0  1  2  3  4][ 5  6  7  8  9][10 11 12 13 14][15 16 17 18 19]]
数组转置后:[[ 0  5 10 15][ 1  6 11 16][ 2  7 12 17][ 3  8 13 18][ 4  9 14 19]]

数组的基本操作

在数组中,一个一维数组称为向量,二维数组称为矩阵,三维称为数据立方。

重置形状reshape

reshape可以在不改变数组数据的同时,改变数组的形状。

numpy.reshape(a,newshape) 

<==>

ndarray.reshape(newtype)

  • a:表示原数组;
  • newshape:用于指定新的形状; 

注意:重置形状后的数组,如果没有赋给源数组,则原数组形状不会发送改变

示例:

a = np.arange(20).reshape(4,5)
print('原数组为:\n',a)
print('改变后,数组为:\n',a.reshape(5,4))
# 重置形状后的数组,如果没有赋给源数组,则原数组形状不会发送改变
原数组为:[[ 0  1  2  3  4][ 5  6  7  8  9][10 11 12 13 14][15 16 17 18 19]]
改变后,数组为:[[ 0  1  2  3][ 4  5  6  7][ 8  9 10 11][12 13 14 15][16 17 18 19]]

数组展开ravel

ravel 的目的是将任意形状的数组变成一个一维数组。

numpy.ravel(a , oder='C')

a为要处理的数组

'F':按列读取

'C':按行读取

 示例:

# 将二维数组按行展开
print(a.ravel(order='C'))
# 将二维数组按列展开
print(a.ravel(order='F'))
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]
[ 0  5 10 15  1  6 11 16  2  7 12 17  3  8 13 18  4  9 14 19]

数组堆叠

在numpy中,相关的堆叠函数有:

  • stack(arrays,axis):沿着新轴连接数组的序列;
  • column_stack():将一维数组作为列堆叠到二维数组中;
  • hstack():按水平方向堆叠数组;
  • vstack():按竖直方向堆叠数组。

示例:

a = np.array([1,2,3])
b = np.array([4,5,6])
# 将a和b堆叠,按行堆叠(2*3)(水平方向)
print(np.stack((a,b),axis=0))
# 按列堆叠,生成3*2的数组(沿竖直方向)
print(np.stack((a,b),axis=1))
[[1 2 3][4 5 6]]
[[1 4][2 5][3 6]]

数组轴移动moveaxis

moveaxis 可以将数组的轴移动到新的位置,改变数组的形状。

numpy.moveaxis(a, source , destination) 

  • a:数组;
  • source:要移动的轴的原始位置;
  • destination:要移动的轴的目标位置。 

示例:

a = np.array([[  [1,2,3],[4,5,6]],[  [7,8,9],[10,11,12]]
])
print('数组的形状:',a.shape,'\na:',a)
a=np.moveaxis(a,0,-1)
print('数组改变轴位置后的形状:',a.shape,'\na:',a)
数组的形状: (2, 2, 3) 
a: [[[ 1  2  3][ 4  5  6]][[ 7  8  9][10 11 12]]]
数组改变轴位置后的形状: (2, 3, 2) 
a: [[[ 1  7][ 2  8][ 3  9]][[ 4 10][ 5 11][ 6 12]]]

数组轴位置交换swapaxes

和上面的moveaxis不同,这个是直接交换两个轴的位置。

numpy.swapaxes( a , axis1 ,axis2) 

  • a:数组;
  • axis1:需要交换的轴位置1;
  • axis2:需要交换的轴位置2. 

示例:

a = np.array([[  [1,2,3],[4,5,6]],[  [7,8,9],[10,11,12]]
])print('数组的形状:',a.shape)
np.swapaxes(a,0,-1).shape
数组的形状: (2, 2, 3)
(3, 2, 2)

数组拆分

在numpy中,数组拆分split有一系列相关的方法:

  • split(arrays,indices_or_sections,axis):将数组拆分为多个子数组;
  • dsplit(arrays,indices_or_sections):按照深度方向将数组拆分为多个子数组;
  • hsplit(arrays,indices_or_sections):按照水平方向将数组拆分为多个子数组;
  • vsplit(arrays,indices_or_sections):按照垂直方向将数组拆分为多个子数组。

示例:

# 首先创建一个3*3的数组,
a = np.arange(9).reshape((3,3))
print(a)
# 再把数组a拆分成3个子数组,每个子数组的元素个数为3
np.split(a,3)
[[0 1 2][3 4 5][6 7 8]]
[array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])]

数组插入insert

 insert(arr,obj,values,axis)

  •  arr:所要插入的数组;
  • obj:要插入数组的目标位置;
  • values:要插入的值或数组;
  • anix:水平方向插入axis=0,竖直插入axis=1

示例:

a = np.arange(20).reshape(4,5)
b = np.arange(5)
print(a)
print(b)
#在a中按照水平方向插入第3行的位置
np.insert(a,2,b,axis=0)
[[ 0  1  2  3  4][ 5  6  7  8  9][10 11 12 13 14][15 16 17 18 19]]
[0 1 2 3 4]
array([[ 0,  1,  2,  3,  4],[ 5,  6,  7,  8,  9],[ 0,  1,  2,  3,  4],[10, 11, 12, 13, 14],[15, 16, 17, 18, 19]])

数组删除delete

delete(arr, obj, axis) 

沿特定轴删除数组中的子数组,与insert类似。

示例:

以上面的插入为基础,删除插入的子数组。

# 删除第3行子数组
np.delete(a,2,axis=0)
array([[ 0,  1,  2,  3,  4],[ 5,  6,  7,  8,  9],[10, 11, 12, 13, 14],[15, 16, 17, 18, 19]])

 数组附加append

 numpy.append(arr, values, axis)

数组附加,其实就是在原数组的基础上按照设置的附加值和轴位置来附加即可。只能在添加到数组末尾。

注意:附加后,会返回一个一维数组

示例:

a = np.arange(10).reshape(2,5)
b = np.arange(4)
np.append(a,b)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3])

重设尺寸resize

除了前面的reshape,那么我们还可以使用resize,对数组的形状进行改变。

 resize(a ,new_shape)

 示例:

# 对数组的形状进行重设(先生成一个4*5的数组)
a = np.arange(20).reshape(4,5)
print(a.shape,'\n',a)#进行重设,需要注意重设的行列乘积要等于原本的行列乘积
a.resize(2,10)
print(a.shape,'\n',a)
(4, 5) [[ 0  1  2  3  4][ 5  6  7  8  9][10 11 12 13 14][15 16 17 18 19]]
(2, 10) [[ 0  1  2  3  4  5  6  7  8  9][10 11 12 13 14 15 16 17 18 19]]
resize和reshape的区别

两个方法都能改变数组的形状,但是reshape在改变数组的形状的时候,不会影响原数组,相当于拷贝了一份,而resize则是在原数组上直接进行操作

两者区别在于 是否会影响到原数组


以上就是本篇所有内容咯~

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux基本使用和程序部署

文章目录 一. Linux背景Linux发行版 二. Linux环境搭建Linux常见命令lspwdcdtouchcatmkdirrmcpmvtailvimgreppsnetstat管道 三. 搭建java部署环境安装jdk安装mysql部署Web项目到Linux 一. Linux背景 1969−1970年,⻉尔实验室的DennisRitchie和KenTompson开发了Unix操作系统. 他…

在Linux操作系统上安装NVM教程——CentOS 7/VMware 17版

目录 一、测试网络是否能上网 二、下载阿里云镜像 三、解决执行yum命令出现报错&#xff08;没有就跳过&#xff09; 四、下载NVM安装包 五、解压NVM安装包 六、安装Node 七、连接新的动态库 八、升级GLIBC版本 九、安装GCC 十、查看当前服务器CentOS版本 一、测试网…

[AWS云]kafka调用和创建

背景:因为因为公司的项目需要使用AWS的kafka&#xff0c;但是在创建和使用过程中都遇到了一些报错和麻烦&#xff0c;毕竟老外的东西&#xff0c;和阿里云、华为使用起来还是不一样。 一、创建&#xff08;创建的配置过程就略了&#xff0c;就是配置一下可用区、型号&#xff0…

闯关leetcode——110. Balanced Binary Tree

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/balanced-binary-tree/description/ 内容 Given a binary tree, determine if it is height-balanced. A height-balanced binary tree is a binary tree in which the depth of the two subtrees…

深入理解售后派单管理系统,功能优势一览

售后派单管理系统优化售后服务流程&#xff0c;提升响应速度、运营效率和服务质量。ZohoDesk等系统通过自动化派单、实时调度监控等功能&#xff0c;助力企业赢得竞争优势。适用于电子产品、汽车、IT及房地产等行业。 一、什么是售后派单管理系统 售后派单管理系统是一种专门用…

第七届机械、控制与计算机工程国际学术会议(ICMCCE2024)

重要信息 大会官网&#xff1a;www.icmcce.com 大会地点&#xff1a;中国杭州 大会时间&#xff1a;2024年10月25-27日 大会简介 第七届机械、控制与计算机工程国际学术会议定于2024年10月25日至27日在中国杭州召开。本届会议由巢湖学院主办&#xff0c;主要围绕“机械”、…

AGI|浅尝多Agent协作框架CrewAI,打造一个智能旅行助手

目录 一、介绍 二、特性 三、使用案例 四、 结语 一、介绍 Crew AI是一个多智能体协作智能框架&#xff0c;可以编排角色扮演的AI智能体。旨在协调角色扮演的自主AI代理&#xff0c;通过促进协作智能体&#xff0c;Crew AI使代理能够无缝协作&#xff0c;共同应对复杂任务。…

【JavaScript】LeetCode:61-65

文章目录 61 课程表62 实现Trie&#xff08;前缀树&#xff09;63 全排列64 子集65 电话号码的字母组合 61 课程表 Map BFS拓扑排序&#xff1a;将有向无环图转为线性顺序。遍历prerequisites&#xff1a;1. 数组记录每个节点的入度&#xff0c;2. 哈希表记录依赖关系。n 6&a…

(十九)、使用 minikube 运行k8s 集群

文章目录 1、机器信息2、官方文档3、启动本机 docker4、安装 minikube5、启动 minikube5.1、报错重试应该做什么&#xff1f; 6、启动后7、安装 Vs Code & k8s extensions8、在 VS Code 查看运行起来的 k8s 集群9、基本命令10、虚拟化不支持 Mac Os 14.3.1 1、机器信息 Ma…

c++算法第3天

本篇文章包含三道算法题&#xff0c;难度由浅入深&#xff0c;适合新手练习哟 目录 第一题 题目链接 题目解析 代码原理 代码编写 本题总结 第二题 题目链接 题目解析 代码原理 代码编写 第三题 题目链接 题目解析 代码原理 代码编写 第一题 题目链接 [NOIP2…

Iceberg 基本操作和快速入门二-Spark DDL操作

Iceberg 基本操作和快速入门一-CSDN博客 启动spark会话 docker exec -it spark-iceberg spark-sql 创建表 CREATE TABLE prod.db.sample ( id bigint NOT NULL COMMENT unique id, data string) USING iceberg; 创建分区表 CREATE TABLE prod.db.sample_par ( id bigint, …

No.17 笔记 | XXE漏洞:XML外部实体注入攻击

1. XXE漏洞概览 XXE&#xff08;XML External Entity&#xff09;是一种允许攻击者干扰应用程序对XML输入处理的漏洞。 1.1 XXE漏洞比喻 想象XML解析器是一个听话的机器人&#xff0c;而XXE就是利用这个机器人的"过分听话"来获取不应该获取的信息。 1.2 XXE漏洞危…

基于51单片机的大棚环境检测系统设计

温室大棚环境监测系统设计&#xff1a;基于51单片机的智能化解决方案 引言 随着现代农业技术的发展&#xff0c;温室大棚种植已成为提高农作物产量和质量的重要手段。为了更好地控制温室环境&#xff0c;提高作物生长效率&#xff0c;环境监测系统成为了温室管理中不可或缺的…

【Java 22 | 9】 深入解析Java 22 :Foreign Function Memory API 的改进

Java 22 对 Foreign Function & Memory API&#xff08;FFI&#xff0c;外部函数和内存 API&#xff09;进行了重要改进&#xff0c;旨在增强 Java 与本地代码及内存的交互能力。这一特性使 Java 程序能够更方便地调用非 Java 代码&#xff0c;如 C/C 库&#xff0c;同时提…

振弦式渗压计压力计算出现负值是什么原因?

振弦式渗压计作为一种高精度的测量仪器&#xff0c;被广泛应用于地质工程、水利水电工程等领域&#xff0c;用于监测土壤或结构物内部的渗水压力。然而&#xff0c;在实际应用中&#xff0c;有时会出现压力计算结果为负值的情况&#xff0c;这不仅影响数据的准确性&#xff0c;…

基于Java微信小程序的水果销售系统详细设计和实现(源码+lw+部署文档+讲解等)

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…

iLogtail 开源两周年:UC 工程师分享日志查询服务建设实践案例

作者&#xff1a;UC 浏览器后端工程师&#xff0c;梁若羽 传统 ELK 方案 众所周知&#xff0c;ELK 中的 E 指的是 ElasticSearch&#xff0c;L 指的是 Logstash&#xff0c;K 指的是 Kibana。Logstash 是功能强大的数据处理管道&#xff0c;提供了复杂的数据转换、过滤和丰富…

快充协议有哪些,都有哪些特点

什么是PD协议 PD协议是一种充电协议&#xff0c;全称为“USB Power Delivery&#xff08;USB PD&#xff09;”&#xff0c;是由USB-IF&#xff08;USB Implementers Forum&#xff09;组织制定的一种标准协议‌。它是一种基于USB接口的快速充电技术&#xff0c;可以实现高达1…

领导满意的可视化数据分析图表,原来一键配置就可以完成

数据分析图表是数据可视化的一种形式&#xff0c;它是将数据以图表的形式呈现出来&#xff0c;从而帮助人们更直观地理解数据和数据之间的关系。数据分析图表可以包括各种类型的图表&#xff0c;例如线图、柱状图、散点图、饼图等。这些图表可以用于描述单个变量的分布&#xf…

2010年国赛高教杯数学建模C题输油管的布置解题全过程文档及程序

2010年国赛高教杯数学建模 C题 输油管的布置 某油田计划在铁路线一侧建造两家炼油厂&#xff0c;同时在铁路线上增建一个车站&#xff0c;用来运送成品油。由于这种模式具有一定的普遍性&#xff0c;油田设计院希望建立管线建设费用最省的一般数学模型与方法。   1. 针对两炼…