Python---Numpy万字总结(2)

NumPy的应用(2)

数组对象的方法

获取描述统计信息

描述统计信息主要包括数据的集中趋势、离散程度和频数分析等,其中集中趋势主要看均值和中位数,离散程度可以看极值、方差、标准差等

array1 = np.random.randint(1, 100, 10)
array1

输出:

array([46, 51, 15, 42, 53, 71, 20, 62,  6, 94])

计算总和、均值和中位数。

代码:

print(array1.sum())
print(np.sum(array1))
print(array1.mean())
print(np.mean(array1))
print(np.median(array1))
print(np.quantile(array1, 0.5))

说明:上面代码中的meanmedianquantile分别是 NumPy 中计算算术平均值、中位数和分位数的函数,其中quantitle函数的第二个参数设置为0.5表示计算50%分位数,也就是中位数。

输出:

460
460
46.0
46.0
48.5
48.5

极值、全距和四分位距离。

代码:

print(array1.max())
print(np.amax(array1))
print(array1.min())
print(np.amin(array1))
print(array1.ptp())
print(np.ptp(array1))
q1, q3 = np.quantile(array1, [0.25, 0.75])
print(q3 - q1)

输出:

94
94
6
6
88
88
34.25

方差、标准差和变异系数。

代码:

print(array1.var())
print(np.var(array1))
print(array1.std())
print(np.std(array1))
print(array1.std() / array1.mean())

输出:

651.2
651.2
25.51862065237853
25.51862065237853
0.5547526228777941

绘制箱线图。

箱线图又称为盒须图,是显示一组数据分散情况的统计图,因形状如箱子而得名。 它主要用于反映原始数据分布的特征,还可以进行多组数据分布特征的比较。

代码:

plt.boxplot(array1, showmeans=True)
plt.ylim([-20, 120])
plt.show()

输出:

在这里插入图片描述

值得注意的是,对于二维或更高维的数组,在获取描述统计信息时,可以通过名为axis的参数指定均值、方差等运算是沿着哪一个轴来执行,axis参数不同,执行的结果可能是大相径庭的,如下所示。

代码:

array2 = np.random.randint(60, 101, (5, 3))
array2

输出:

array([[72, 64, 73],[61, 73, 61],[76, 85, 77],[97, 88, 90],[63, 93, 82]])

代码:

array2.mean()

输出:

77.0

代码:

array2.mean(axis=0)

输出:

array([73.8, 80.6, 76.6])

代码:

array2.mean(axis=1)

输出:

array([69.66666667, 65.        , 79.33333333, 91.66666667, 79.33333333])

代码:

array2.max(axis=0)

输出:

array([97, 93, 90])

代码:

array2.max(axis=1)

输出:

array([73, 73, 85, 97, 93])

再看看绘制箱线图,对于二维数组每一列都会产生一个统计图形,如下所示。

代码:

plt.boxplot(array2, showmeans=True)
plt.ylim([-20, 120])
plt.show()

输出:

需要说明的是,NumPy 的数组对象并没有提供计算几何平均值、调和平均值、去尾平均值等的方法,如果有这方面的需求,可以使用名为 scipy 的三方库,它的stats模块中提供了这些函数。此外,该模块还提供了计算众数、变异系数、偏态、峰度的函数,代码如下所示。

代码:

from scipy import statsprint(np.mean(array1))                # 算术平均值
print(stats.gmean(array1))            # 几何平均值
print(stats.hmean(array1))            # 调和平均值
print(stats.tmean(array1, [10, 90]))  # 去尾平均值
print(stats.variation(array1))        # 变异系数
print(stats.skew(array1))             # 偏态系数
print(stats.kurtosis(array1))         # 峰度系数

输出:

46.0
36.22349548825599
24.497219530825497
45.0
0.5547526228777941
0.11644192634527782
-0.7106251396024126
其他相关方法概述
  1. all() / any()方法:判断数组是否所有元素都是True / 判断数组是否有为True的元素。

  2. astype()方法:拷贝数组,并将数组中的元素转换为指定的类型。

  3. reshape()方法:调整数组对象的形状。

  4. dump()方法:保存数组到二进制文件中,可以通过 NumPy 中的load()函数从保存的文件中加载数据创建数组。

    代码:

    array.dump('array1-data')
    array3 = np.load('array1-data', allow_pickle=True)
    array3
    

    输出:

    array([46, 51, 15, 42, 53, 71, 20, 62,  6, 94])
    
  5. tofile()方法:将数组对象写入文件中。

    array1.tofile('res/array.txt', sep=',')
    
  6. fill()方法:向数组中填充指定的元素。

  7. flatten()方法:将多维数组扁平化为一维数组。

    代码:

    array2.flatten()
    

    输出:

    array([1, 2, 3, 4, 5, 6, 7, 8, 9])
    
  8. nonzero()方法:返回非0元素的索引。

  9. round()方法:对数组中的元素做四舍五入操作。

  10. sort()方法:对数组进行就地排序。

    代码:

    array1.sort()
    array1
    

    输出:

    array([ 6, 15, 20, 42, 46, 51, 53, 62, 71, 94])
    
  11. swapaxes()transpose()方法:交换数组指定的轴和转置。

    代码:

    array2.swapaxes(0, 1)
    

    输出:

    array([[1, 4, 7],[2, 5, 8],[3, 6, 9]])
    

    代码:

    array2.transpose()
    

    输出:

    array([[1, 4, 7],[2, 5, 8],[3, 6, 9]])
    
  12. tolist()方法:将数组转成 Python 中的list

    代码:

    print(array2.tolist())
    print(type(array2.tolist()))
    

    输出:

    [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    <class 'list'>
    

数组的运算

使用 NumPy 最为方便的是当需要对数组元素进行运算时,不用编写循环代码遍历每个元素,所有的运算都会自动的矢量化。简单的说就是,NumPy 中的数学运算和数学函数会自动作用于数组中的每个成员。

数组跟标量的运算

NumPy 的数组可以跟一个数值进行加、减、乘、除、求模、求幂等运算,对应的运算会作用到数组的每一个元素上,如下所示。

代码:

array1 = np.arange(1, 10)
print(array1 + 10)
print(array1 * 10)

输出:

[11 12 13 14 15 16 17 18 19]
[10 20 30 40 50 60 70 80 90]

除了上述的运算,关系运算也是没有问题的,之前讲布尔索引的时候已经遇到过了。

代码:

print(array1 > 5)
print(array1 % 2 == 0)

输出:

[False False False False False  True  True  True  True]
[False  True False  True False  True False  True False]
数组跟数组的运算

NumPy 的数组跟数组也可以执行算术运算和关系运算,运算会作用于两个数组对应的元素上,这就要求两个数组的形状(shape属性)要相同,如下所示。

代码:

array2 = np.array([1, 1, 1, 2, 2, 2, 3, 3, 3])
print(array1 + array2)
print(array1 * array2)
print(array1 ** array2)

输出:

[ 2  3  4  6  7  8 10 11 12]
[ 1  2  3  8 10 12 21 24 27]
[  1   2   3  16  25  36 343 512 729]

代码:

print(array1 > array2)
print(array1 % array2 == 0)

输出:

[False  True  True  True  True  True  True  True  True]
[ True  True  True  True False  True False False  True]
一元函数

NumPy 中通用一元函数的参数是一个数组对象,函数会对数组进行元素级的处理,例如:sqrt函数会对数组中的每个元素计算平方根,而log2函数会对数组中的每个元素计算以2为底的对数,代码如下所示。

代码:

print(np.sqrt(array1))
print(np.log2(array1))

输出:

[1.         1.41421356 1.73205081 2.         2.23606798 2.449489742.64575131 2.82842712 3.        ]
[0.         1.         1.5849625  2.         2.32192809 2.58496252.80735492 3.         3.169925  ]

表1:一元函数

函数说明
abs / fabs求绝对值的函数
sqrt求平方根的函数,相当于array ** 0.5
square求平方的函数,相当于array ** 2
exp计算 e x e^x ex的函数
log / log10 / log2对数函数(e为底 / 10为底 / 2为底)
sign符号函数(1 - 正数;0 - 零;-1 - 负数)
ceil / floor上取整 / 下取整
isnan返回布尔数组,NaN对应True,非NaN对应False
isfinite / isinf判断数值是否为无穷大的函数
cos / cosh / sin三角函数
sinh / tan / tanh三角函数
arccos / arccosh / arcsin反三角函数
arcsinh / arctan / arctanh反三角函数
rint / round四舍五入函数
二元函数

NumPy 中通用二元函数的参数是两个数组对象,函数会对两个数组中的对应元素进行运算,例如:maximum函数会对两个数组中对应的元素找最大值,而power函数会对两个数组中对应的元素进行求幂操作,代码如下所示。

代码:

array3 = np.array([[4, 5, 6], [7, 8, 9]])
array4 = np.array([[1, 2, 3], [3, 2, 1]])
print(np.maximum(array3, array4))
print(np.power(array3, array4))

输出:

[[4 5 6][7 8 9]]
[[  4  25 216][343  64   9]]

表2:二元函数

函数说明
add(x, y) / substract(x, y)加法函数 / 减法函数
multiply(x, y) / divide(x, y)乘法函数 / 除法函数
floor_divide(x, y) / mod(x, y)整除函数 / 求模函数
allclose(x, y)检查数组xy元素是否几乎相等
power(x, y)数组 x x x的元素 x i x_i xi和数组 y y y的元素 y i y_i yi,计算 x i y i x_i^{y_i} xiyi
maximum(x, y) / fmax(x, y)两两比较元素获取最大值 / 获取最大值(忽略NaN)
minimum(x, y) / fmin(x, y)两两比较元素获取最小值 / 获取最小值(忽略NaN)
dot(x, y)点积运算(数量积,通常记为 ⋅ \cdot ,用于欧几里得空间(Euclidean space))
inner(x, y)内积运算(内积的含义要高于点积,点积相当于是内积在欧几里得空间 R n \mathbb{R}^n Rn的特例,而内积可以推广到赋范向量空间,只要它满足平行四边形法则即可)
cross(x, y) 叉积运算(向量积,通常记为 × \times ×,运算结果是一个向量)
outer(x, y)外积运算(张量积,通常记为 ⨂ \bigotimes ,运算结果通常是一个矩阵)
intersect1d(x, y)计算xy的交集,返回这些元素构成的有序数组
union1d(x, y)计算xy的并集,返回这些元素构成的有序数组
in1d(x, y)返回由判断x 的元素是否在y中得到的布尔值构成的数组
setdiff1d(x, y)计算xy的差集,返回这些元素构成的数组
setxor1d(x, y)计算xy的对称差,返回这些元素构成的数组

说明:关于向量和矩阵的运算,我们在下一个章节加以说明。

广播机制

上面数组运算的例子中,两个数组的形状(shape属性)是完全相同的,
注意(什么情况会触发广播机制以及广播机制的特点):
1.数组形状不同
2.数组的某一维度等长
3.其中一个数组的某一维度为1

我们再来研究一下,两个形状不同的数组是否可以直接做二元运算或使用通用二元函数进行运算,请看下面的例子。

代码:

array5 = np.array([[0, 0, 0], [1, 1, 1], [2, 2, 2], [3, 3, 3]])
array6 = np.array([1, 2, 3])
array5 + array6

输出:

array([[1, 2, 3],[2, 3, 4],[3, 4, 5],[4, 5, 6]])

代码:

array7 = np.array([[1], [2], [3], [4]])
array5 + array7

输出:

array([[1, 1, 1],[3, 3, 3],[5, 5, 5],[7, 7, 7]])

通过上面的例子,我们发现形状不同的数组仍然有机会进行二元运算,但这不代表任意形状的数组都可以进行二元运算。简单的说,只有两个数组后缘维度相同或者后缘维度不同但其中一个数组后缘维度为1时,广播机制才会被触发。通过广播机制,NumPy 将两个原本形状不相同的数组变成形状相同,才能进行二元运算。所谓后缘维度,指的是数组形状(shape属性)从后往前看对应的部分,我们举例说明。

上图中,一个数组的形状是(4, 3),另一个数组的形状是(3, ),从后往前看对应的部分都是3,属于后缘维度相同,可以应用广播机制,第二个数组会沿着缺失元素那个轴的方向去广播自己,最终让两个数组形状达成一致。

上图中,一个数组的形状是(3, 4, 2),另一个数组的形状是(4, 2),从后往前看对应的部分都是(4, 2),属于后缘维度相同,可以应用广播机制,第二个数组会沿着缺失元素那个轴的方向去广播自己,最终让两个数组形状达成一致。

上图中,一个数组的形状是(4, 3),另一个数组的形状是(4, 1),这是后缘维度不相同的情况,但是第二个数组跟第一个数组不同的地方为1,第二个数组可以沿着为1 的那个轴广播自己,最终让两个数组形状达成一致。

思考:一个3行1列的二维数组和一个1行3列的二维数组能够执行加法运算吗?

其他常用函数

除了上面讲到的函数外,NumPy 中还提供了很多用于处理数组的函数,ndarray对象的很多方法也可以通过调用函数来实现,下表给出了一些常用的函数。

表3:NumPy其他常用函数

函数说明
unique去除数组重复元素,返回唯一元素构成的有序数组
copy返回拷贝数组得到的数组
sort返回数组元素排序后的拷贝
split / hsplit / vsplit将数组拆成若干个子数组
stack / hstack / vstack将多个数组堆叠成新数组
concatenate沿着指定的轴连接多个数组构成新数组
append / insert向数组末尾追加元素 / 在数组指定位置插入元素
argwhere找出数组中非0元素的位置
extract / select / where按照指定的条件从数组中抽取或处理数组元素
flip沿指定的轴翻转数组中的元素
fromregex通过读取文件和正则表达式解析获取数据创建数组对象
repeat / tile通过对元素的重复来创建新数组
roll沿指定轴对数组元素进行移位
resize重新调整数组的大小
place / put将数组中满足条件的元素/指定的元素替换为指定的值
partition用选定的元素对数组进行一次划分并返回划分后的数组

去重(重复元素只保留一项)

代码:

np.unique(array5)

输出:

array([0, 1, 2, 3])

堆叠和拼接

代码:

array8 = np.array([[1, 1, 1], [2, 2, 2], [3, 3, 3]])
array9 = np.array([[4, 4, 4], [5, 5, 5], [6, 6, 6]])
np.hstack((array8, array9))

输出:

array([[1, 1, 1, 4, 4, 4],[2, 2, 2, 5, 5, 5],[3, 3, 3, 6, 6, 6]])

代码:

np.vstack((array8, array9))

输出:

array([[1, 1, 1],[2, 2, 2],[3, 3, 3],[4, 4, 4],[5, 5, 5],[6, 6, 6]])

代码:

np.concatenate((array8, array9))

输出:

array([[1, 1, 1],[2, 2, 2],[3, 3, 3],[4, 4, 4],[5, 5, 5],[6, 6, 6]])

代码:

np.concatenate((array8, array9), axis=1)

输出:

array([[1, 1, 1, 4, 4, 4],[2, 2, 2, 5, 5, 5],[3, 3, 3, 6, 6, 6]])

追加和插入元素

代码:

np.append(array1, [10, 100])

输出:

array([  1,   2,   3,   4,   5,   6,   7,   8,   9,  10, 100])

代码:

np.insert(array1, 1, [98, 99, 100])

输出:

array([  1,  98,  99, 100,   2,   3,   4,   5,   6,   7,   8,   9])

抽取和处理元素

代码:

np.extract(array1 % 2 != 0, array1)

输出:

array([1, 3, 5, 7, 9])

说明:上面extract函数的操作相当于我们之前讲的布尔索引。

代码:

np.select([array1 <= 3, array1 >= 7], [array1 * 10, array1 ** 2])

输出:

array([10, 20, 30,  0,  0,  0, 49, 64, 81])

说明:上面select函数的第一个参数设置了两个条件,满足第一个条件的元素执行了乘以10的操作,满足第二个条件的元素执行了求平方的操作,两个条件都不能满足的数组元素会被处理为0。

代码:

np.where(array1 <= 5, array1 * 10, array1 ** 2)

输出:

array([10, 20, 30, 40, 50, 36, 49, 64, 81])

重复数组元素创建新数组

代码:

np.repeat(array1, 3)

输出:

array([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9])

代码:

np.tile(array1, 2)

输出:

array([1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9])

调整数组大小

代码:

np.resize(array1, (5, 3))

输出:

array([[1, 2, 3],[4, 5, 6],[7, 8, 9],[1, 2, 3],[4, 5, 6]])

代码:

 np.resize(array5, (2, 4))

输出:

array([[0, 0, 0, 1],[1, 1, 2, 2]])

替换数组元素

代码:

np.put(array1, [0, 1, -1, 3, 5], [100, 200])
array1

输出:

array([100, 200,   3, 200,   5, 100,   7,   8, 100])

说明:上面put函的第二个参数给出了要被替换的元素的索引,但是用来作为替换值的元素只有100200,所以这两个值会被循环使用,因此索引为01-135的元素被依次替换成了100200100200100

代码:

np.place(array1, array1 > 5, [1, 2, 3])
array1

输出:

array([1, 2, 3, 3, 5, 1, 2, 3, 1])

注意put函数和place函数都没有返回新的数组对象,而是在原来的数组上直接进行替换。

还是需要多敲多练才能熟以运用哦~~~

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

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

相关文章

【linux软件基础知识】如何使用 run_list 字段将任务放入就绪队列中

在给定的代码片段中,struct task_struct 表示内核中任务或进程的进程控制块 (PCB)。 run_list 字段的类型为 struct list_head,这表明它是链表实现的一部分。 run_list字段在Linux内核中常用来表示任务在调度队列中的位置,例如就绪队列或各种优先级队列。 init_task是一个…

单链表经典算法LeetCode--203.移除链表元素(两种方法解)

1.链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09;【点击即可跳转】 分析此题提供两种思路&#xff1a; 1.遍历原链表&#xff0c;将值为val的节点释放掉&#xff08;双指针法&#xff09; 定义一个pcur指针指向头节点&#xff0c;定义一个prev指针指向NULL 需要注…

Coursera吴恩达深度学习专项课程01: Neural Networks and Deep Learning 学习笔记 Week 01

Week 01 of Neural Networks and Deep Learning Course Certificate 本文是学习 https://www.coursera.org/learn/neural-networks-deep-learning 这门课的笔记 Course Intro 文章目录 Week 01 of Neural Networks and Deep Learning[0] Welcome to the Deep Learning Spec…

深度学习——前馈全连接神经网络

前馈全连接神经网络 1.导入需要的工具包2.数据导入与数据观察&#xff08;1&#xff09;读取csv的文件信息&#xff1a;&#xff08;2&#xff09;训练数据前5行&#xff08;3&#xff09;打印第一个图&#xff08;4&#xff09;观察数据中的信息&#xff08;5&#xff09;查看…

数据中台:企业数字化转型的桥梁_光点科技

在数字化日益深入企业核心运营的今天&#xff0c;数据中台作为一个关键的信息化架构&#xff0c;正逐渐崭露头角&#xff0c;成为连接企业各部门、优化数据管理和推动业务创新的重要桥梁。 一、数据中台&#xff1a;连接与整合的桥梁 数据中台的核心作用在于连接与整合。传统的…

【计算机毕业设计】基于SSM++jsp的公司员工信息管理系统【源码+lw+部署文档+讲解】

目录 1 绪论 1.1 研究背景 1.2 目的和意义 1.3 论文结构安排 2 相关技术 2.1 SSM框架介绍 2.2 B/S结构介绍 2.3 Mysql数据库介绍 3 系统分析 3.1 系统可行性分析 3.1.1 技术可行性分析 3.1.2 经济可行性分析 3.1.3 运行可行性分析 3.2 系统性能分析 3.2.1 易用性指标 3.2.2 可…

事件高级部分

一&#xff0c;注册事件 即给元素添加事件 1.传统注册方式 2.方法监听注册方式 事件类型&#xff1a;字符串形式&#xff0c;不用带on 可以给一个元素添加多个程序 二.删除事件 1.方式 参数见上文 三.DOM事件流 事件的传播过程叫做事件流 js代码只能获取一个阶段&#xf…

OpenGL导入的纹理图片错位

在OpenGL中导入图片的纹理照片的函数为 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, p_w, p_h, 0, GL_BGR, GL_UNSIGNED_BYTE, pic_data);其中p_w, p_h为图片的宽和高&#xff0c;pic_data为指向图片存储空间的的地址(unsigned char *类型) 在OpenGL中图片默认是4字节对齐的&…

JUC下的BlockingQueue详解

BlockingQueue是Java并发包(java.util.concurrent)中提供的一个接口&#xff0c;它扩展了Queue接口&#xff0c;增加了阻塞功能。这意味着当队列满时尝试入队操作&#xff0c;或者队列空时尝试出队操作&#xff0c;线程会进入等待状态&#xff0c;直到队列状态允许操作继续。这…

HDFS HA 修改nameservice

本例中修改将原来的hdfs-ha 修改为 hdfs-ns 停止HDFS, 防止新的业务操作 等待停止结束 KDE中需要调整的配置项如下图所示 a.搜索栏找到fs.defaultFS&#xff0c;将hdfs://hdfs-ha改为hdfs://hdfs-ns b.搜索栏找到dfs.nameservices&#xff0c;将hdfs-ha改为hdfs-ns c.搜索栏找…

设施农业(大棚种植)远程监控系统设计 STM32+51单片机 含pcb 上下位机源码 原理图

目录 摘要 1. 引言 2. 系统方案 3. 系统硬件设计 4. 系统软件设计 5. 系统创新 6. 评测与结论 7、实物图 8、原理图 ​9、程序 10、资料内容 资料下载地址&#xff1a;设施农业(大棚种植)远程监控系统设计 STM3251单片机 含pcb 上下位机源码 原理图 论文 摘要 …

FileLink跨网文件传输医疗行业解决方案

随着医疗行业的快速发展&#xff0c;医疗机构之间的信息共享和文件传输需求日益增加。然而&#xff0c;由于网络环境的复杂性和数据安全性的要求&#xff0c;传统的文件传输方式已经无法满足医疗行业的需求。为此&#xff0c;我们推出了FileLink跨网文件传输医疗行业解决方案&a…

【NTN 卫星通信】参考卫星集成场景和架构

1 卫星接入场景 1.1 同一PLMN内的卫星和地面接入网 一个PLMN可以同时具有地面3GPP接入和卫星3GPP接入。在此场景中&#xff0c;单独的N2实例处理单独的访问类型节点。然而&#xff0c;卫星接入网的覆盖范围可以跨越地面接入网的覆盖范围。 图1 同PLMN架构下的卫星和地面3GPP接…

基于51单片机的多路温度检测调节串口传输系统

基于51单片机的多路温度检测调节 &#xff08;仿真&#xff0b;程序&#xff09; 功能介绍 具体功能&#xff1a; 1.采用四个DS18B20温度传感器测温,LCD1602显示四路温度值; 2.三个按键可以设置温度上下限; 3.当每路温度值超过设定的上或下限时,蜂鸣器报警,对应的指示灯亮;…

【PHP【实战版】系统性学习】——登录注册页面的教程,让编写PHP注册变成一个简单的事情

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

无人机+通信中继:短波电台技术详解

随着无线通信技术的不断发展&#xff0c;无人机作为一种新型的信息传输平台&#xff0c;已经在多个领域得到了广泛应用。其中&#xff0c;无人机与短波电台的结合&#xff0c;为通信中继领域带来了全新的可能性。本文将详细解析无人机在通信中继中的应用&#xff0c;以及短波电…

sentinel搭建及使用

1.添加依赖&#xff08;版本可依赖于父pom&#xff09; SentinalResource注解&#xff1a; 添加依赖&#xff1a; blockhandler: fallback:

简易留言板

目录 前端实现 数据库的使用 创建数据表 创建项目 连接数据库 后端实现 接口定义 持久层 业务逻辑层 控制层 前端代码完善 留言板是一个常见的功能&#xff0c;在本篇文章中&#xff0c;将实现一个简易的留言板&#xff1a; 页面中能够显示所有留言内容&#xff0c…

《视觉十四讲》例程运行记录(6)——运行ch9后端优化CeresBA和g2o求解BA的实践例程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、运行ch9的例程代码1. MeshLab安装2. 编译例程代码前的修改3. 编译例程 一、运行ch9的例程代码 1. MeshLab安装 (1) 软件中心安装 搜索&#xff1a;MeshLab&am…

oracle 新_多种块大小的支持9i

oracle 新_多种块大小的支持 conn sys/sys as sysdba SHOW PARAMETER CACHE ALTER SYSTEM SET DB_CACHE_SIZE16M; ALTER SYSTEM SET DB_4K_CACHE_SIZE8M; CREATE TABLESPACE K4 DATAFILE F:\ORACLE\ORADATA\ZL9\K4.DBF SIZE 2M BLOCKSIZE 4K; CREATE TABLE SCOTT.A1 TABLESP…