Python基础学习——数据学习教程

在这里插入图片描述

  • 本期内容主要是,帮助刚刚入门的新手小白们快速掌握 “numpy” 的常用功能,保证日常绝大多数场景的使用。可作为机器学习或深度学习的先修课程,也可作为快速备查手册。

在这里插入图片描述

> 教程原则如下:
  • 偏实用高频 API
  • 展示实际用法
  • 简单直接
  • 使用说明:内容中⭐(1-5个)表示重要程度,越多越重要;⚠️ 表示需要特别注意的
  • 提示:使用过程中无须过多关注 API 各种参数细节,教程提供的用法足以应付绝大部分场景,更深入的可自行根据需要探索或学习后续的教程。

下面正式开始讲解。

# 导入 library  
import numpy as np  
# 画图工具  
import matplotlib.pyplot as plt  

创建和生成

  • 本节主要介绍 array 的创建和生成。为什么会把这个放在最前面呢?主要有以下两个方面原因:
  • 首先,在实际工作过程中,我们时不时需要验证或查看 array 相关的 API 或互操作。同时,有时候在使用 sklearn,matplotlib,PyTorch,Tensorflow 等工具时也需要一些简单的数据进行实验。
所以,先学会如何快速拿到一个 array 是有很多益处的。本节我们主要介绍以下几种常用的创建方式:
  • 使用列表或元组
  • 使用 arange
  • 使用 linspace/logspace
  • 使用 ones/zeros
  • 使用 random
  • 从文件读取
其中,最常用的一般是 linspace/logspace 和 random,前者常常用在画坐标轴上,后者则用于生成「模拟数据」。举例来说,当我们需要画一个函数的图像时,X 往往使用 linspace 生成,然后使用函数公式求得 Y,再 plot;当我们需要构造一些输入(比如 X)或中间输入(比如 Embedding、hidden state)时,random 会异常方便。

从python列表或元组创建

  • 重点掌握传入 list 创建一个 array 即可:“np.array(list)”
  • ⚠️ 需要注意的是:「数据类型」。如果您足够仔细的话,可以发现下面第二组代码第 2 个数字是「小数」(注:Python 中 1. == 1.0),而 array 是要保证每个元素类型相同的,所以会帮您把 array 转为一个 float 的类型。
# 一个 list  
np.array([1,2,3])  array([1, 2, 3])  # 二维(多维类似)  
# 注意,有一个小数哦  
np.array([[1, 2., 3], [4, 5, 6]])  array([[1., 2., 3.],  [4., 5., 6.]])  # 您也可以指定数据类型  
np.array([1, 2, 3], dtype=np.float16)  array([1., 2., 3.], dtype=float16)  # 如果指定了 dtype,输入的值都会被转为对应的类型,而且不会四舍五入  
lst = [  [1, 2, 3],  [4, 5, 6.8]  
]  
np.array(lst, dtype=np.int32)  array([[1, 2, 3],  [4, 5, 6]], dtype=int32) # 一个 tuple  
np.array((1.1, 2.2))  array([1.1, 2.2])  # tuple,一般用 list 就好,不需要使用 tuple  
np.array([(1.1, 2.2, 3.3), (4.4, 5.5, 6.6)])  array([[1.1, 2.2, 3.3],  [4.4, 5.5, 6.6]])  # 转换而不是上面的创建,其实是类似的,无须过于纠结  
np.asarray((1,2,3))  array([1, 2, 3])  np.asarray(([1., 2., 3.], (4., 5., 6.)))  array([[1., 2., 3.],          [4., 5., 6.]])   ``   

使用arange生成

  • "range"是 Python内置的整数序列生成器,“arange"是"numpy"的,效果类似,会生成一维的向量。我们偶尔会需要使用这种方式来构造"array”,比如:
  • 需要创建一个连续一维向量作为输入(比如编码位置时可以使用)
  • 需要观察筛选、抽样的结果时,有序的 array 一般更加容易观察
  • ⚠️ 需要注意的是:在 reshape 时,目标的 shape 需要的元素数量一定要和原始的元素数量相等。
np.arange(12).reshape(3, 4)  array([[ 0,  1,  2,  3],  [ 4,  5,  6,  7],  [ 8,  9, 10, 11]])  # 注意,是小数哦  
np.arange(12.0).reshape(4, 3)  array([[ 0.,  1.,  2.],  [ 3.,  4.,  5.],  [ 6.,  7.,  8.],  [ 9., 10., 11.]])  
np.arange(100, 124, 2).reshape(3, 2, 2  array(\[\[\[100, 102\],  \[104, 106\]\],  \[\[108, 110\],  \[112, 114\]\],  \[\[116, 118\],  \[120, 122\]\]\])  # shape size 相乘要和生成的元素数量一致  
np.arange(100., 124., 2).reshape(2,3,4)  \---------------------------------------------------------------------------  ValueError                                Traceback (most recent call last)  <ipython-input-20-fc850bf3c646> in <module>  
\----> 1 np.arange(100., 124., 2).reshape(2,3,4)  ValueError: cannot reshape array of size 12 into shape (2,3,4)  

使用 linspace/logspace 生成

  • 这是我们遇到的第一个比较重要的 API,前者需要传入 3 个参数:开头,结尾,数量;后者需要额外传入一个"base",它默认是 10。
  • ⚠️ 需要注意的是:第三个参数并不是步长。
np.linspace
# 线性  
np.linspace(0, 9, 10).reshape(2, 5)  
array([[0., 1., 2., 3., 4.],  [5., 6., 7., 8., 9.]])  
np.linspace(0, 9, 6).reshape(2, 3)  
array([[0. , 1.8, 3.6],  [5.4, 7.2, 9. ]])  
# 指数 base 默认为 10  
np.logspace(0, 9, 6, base=np.e).reshape(2, 3)  
array([[1.00000000e+00, 6.04964746e+00, 3.65982344e+01],  [2.21406416e+02, 1.33943076e+03, 8.10308393e+03]])  
# _ 表示上(最近)一个输出  
# logspace 结果 log 后就是上面 linspace 的结果  
np.log(_)  
array([[0. , 1.8, 3.6],  [5.4, 7.2, 9. ]])  
下面我们更进一步看一下:
N = 20  
x = np.arange(N)  
y1 = np.linspace(0, 10, N) * 100  
y2 = np.logspace(0, 10, N, base=2)  plt.plot(x, y2, '*');  
plt.plot(x, y1, 'o');# 检查每个元素是否为 True  
# base 的 指数为 linspace 得到的就是 logspace  
np.alltrue(2 ** np.linspace(0, 10, N)  == y2)  True``   ``⚠️ 补充:关于 array 的条件判断# 不能直接用 if 判断 array 是否符合某个条件  
arr = np.array([1, 2, 3])  
cond1 = arr > 2  
cond1  array([False, False,  True])  if cond1:  print("这不行")  
ValueError Traceback (most recent call last)in  
\----> 1 if cond1:  
2 print(“这不行”)ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
# 即便你全是 True 它也不行  
arr = np.array([1, 2, 3])  
cond2 = arr > 0  
cond2  array([ True,  True,  True])  if cond2:  print("这还不行")  ValueError Traceback (most recent call last)in  
\----> 1 if cond2:  
2 print(“这还不行”)ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()# 咱们只能用 any 或 all,这个很容易犯错,请务必注意。  
if cond1.any():  print("只要有一个为True就可以,所以——我可以")  只要有一个为True就可以,所以——我可以  if cond2.all():  print("所有值为True才可以,我正好这样")  所有值为True才可以,我正好这样   ``   

使用 ones/zeros 创建

  • 创建全"1/0 array"的快捷方式。需要注意的是"np.zeros_like"或"np.ones_like",二者可以快速生成给定"array"一样"shape"的"0"或"1"向量,这在需要"Mask"某些位置时可能会用到。
  • ⚠️ 需要注意的是:创建出来的"array"默认是"float"类型。
np.ones(3)  array(\[1., 1., 1.\])np.ones((2, 3))  array(\[\[1., 1., 1.\],  
\[1., 1., 1.\]\])np.zeros((2,3,4))  array(\[\[\[0., 0., 0., 0.\],  
\[0., 0., 0., 0.\],  
\[0., 0., 0., 0.\]\],\[\[0., 0., 0., 0.\],  
\[0., 0., 0., 0.\],  
\[0., 0., 0., 0.\]\]\])# 像给定向量那样的 0 向量(ones_like 是 1 向量)  
np.zeros_like(np.ones((2,3,3)))  array(  
\[\[\[0., 0., 0.\],  
\[0., 0., 0.\],  
\[0., 0., 0.\]\],\[\[0., 0., 0.\],  
\[0., 0., 0.\],  
\[0., 0., 0.\]\]\]) \`\`

使用random生成

  • 如果要在这一节选一个最重要的 API,那一定是"random"无疑了,这里我们只介绍几个比较常用的「生产」数据相关的 API。它们经常用于随机生成训练或测试数据,神经网路初始化等。
  • ⚠️ 需要注意的是:这里我们统一推荐使用新的 API 方式创建,即通过"np.random.default_rng()“先生成"Generator”,然后再在此基础上生成各种分布的数据(记忆更加简便清晰)。不过我们依然会介绍就的API用法,因为很多代码中使用的还是旧的,您可以混个眼熟。
# 0-1 连续均匀分布  
np.random.rand(2, 3)  array(\[\[0.42508994, 0.5842191 , 0.09248675\],  
\[0.656858 , 0.88171822, 0.81744539\]\])# 单个数  
np.random.rand()  0.29322641374172986# 0-1 连续均匀分布  
np.random.random((3, 2))  array(\[\[0.17586271, 0.5061715 \],  
\[0.14594537, 0.34365713\],  
\[0.28714656, 0.40508807\]\])# 指定上下界的连续均匀分布  
np.random.uniform(-1, 1, (2, 3))  array(\[\[ 0.66638982, -0.65327069, -0.21787878\],  
\[-0.63552782, 0.51072282, -0.14968825\]\])# 上面两个的区别是 shape 的输入方式不同,无伤大雅了  
# 不过从 1.17 版本后推荐这样使用(以后大家可以用新的方法)  
# rng 是个 Generator,可用于生成各种分布  
rng = np.random.default_rng(42)  
rng  Generator(PCG64) at 0x111B5C5E0# 推荐的连续均匀分布用法  
rng.random((2, 3))  array(\[\[0.77395605, 0.43887844, 0.85859792\],  
\[0.69736803, 0.09417735, 0.97562235\]\])# 可以指定上下界,所以更加推荐这种用法  
rng.uniform(0, 1, (2, 3))  array(\[\[0.47673156, 0.59702442, 0.63523558\],  
\[0.68631534, 0.77560864, 0.05803685\]\])# 随机整数(离散均匀分布),不超过给定的值(10)  
np.random.randint(10, size=2)  array(\[6, 3\])# 随机整数(离散均匀分布),指定上下界和 shape  
np.random.randint(0, 10, (2, 3))  array(\[\[8, 6, 1\],  
\[3, 8, 1\]\])# 上面推荐的方法,指定大小和上界  
rng.integers(10, size=2)  array(\[9, 7\])

上面推荐的方法,指定上下界

rng.integers(0, 10, (2, 3))  array(\[\[5, 9, 1\],  
\[8, 5, 7\]\])

标准正态分布

np.random.randn(2, 4)  array(\[\[-0.61241167, -0.55218849, -0.50470617, -1.35613877\],  
\[-1.34665975, -0.74064846, -2.5181665 , 0.66866357\]\])# 上面推荐的标准正态分布用法  
rng.standard_normal((2, 4))  array(\[\[ 0.09130331, 1.06124845, -0.79376776, -0.7004211 \],  
\[ 0.71545457, 1.24926923, -1.22117522, 1.23336317\]\])# 高斯分布  
np.random.normal(0, 1, (3, 5))  array(\[\[ 0.30037773, -0.17462372, 0.23898533, 1.23235421, 0.90514996\],  
\[ 0.90269753, -0.5679421 , 0.8769029 , 0.81726869, -0.59442623\],  
\[ 0.31453468, -0.18190156, -2.95932929, -0.07164822, -0.23622439\]\])# 上面推荐的高斯分布用法  
rng.normal(0, 1, (3, 5))  array(\[\[ 2.20602146, -2.17590933, 0.80605092, -1.75363919, 0.08712213\],  
\[ 0.33164095, 0.33921626, 0.45251278, -0.03281331, -0.74066207\],  
\[-0.61835785, -0.56459129, 0.37724436, -0.81295739, 0.12044035\]\])
总之,一般会用的就是2个分布:均匀分布和正态(高斯)分布。另外,“size"可以指定"shape”。
# 离散均匀分布  
rng.integers(low=0, high=10, size=5)  
array(\[0, 7, 6, 4, 4\])
# 连续均匀分布  
rng.uniform(low=0, high=10, size=5)  
array(\[6.97368029, 0.94177348, 9.75622352, 7.61139702, 7.86064305\])
# 正态(高斯)分布  
rng.normal(loc=0.0, scale=1.0, size=(2, 3))  
array(\[\[-0.01680116, -0.85304393, 0.87939797\], \[ 0.77779194, 0.0660307 , 1.12724121\]\]) \`\`#### [](https://blog.csdn.net/m0_75067629/article/details/140042099?spm=1001.2014.3001.5502)从文件读取
  • 这小节主要用于加载实现存储好的权重参数或预处理好的数据集,有时候会比较方便,比如训练好的模型参数加载到内存里用来提供推理服务,或者耗时很久的预处理数据直接存起来,多次实验时不需要重新处理。
  • ⚠️ 需要注意的是:存储时不需要写文件名后缀,会自动添加。
# 直接将给定矩阵存为 a.npy  
np.save('./data/a', np.array([[1, 2, 3], [4, 5, 6]]))  
# 可以将多个矩阵存在一起,名为 `b.npz`  
np.savez("./data/b", a=np.arange(12).reshape(3, 4), b=np.arange(12.).reshape(4, 3))  
# 和上一个一样,只是压缩了  
np.savez_compressed("./data/c", a=np.arange(12).reshape(3, 4), b=np.arange(12.).reshape(4, 3))  
# 加载单个 array  
np.load("data/a.npy")  
array([[1, 2, 3],  [4, 5, 6]])  
# 加载多个,可以像字典那样取出对应的 array  
arr = np.load("data/b.npz")  
arr["a"]  
array(\[\[ 0, 1, 2, 3\],  
\[ 4, 5, 6, 7\],  
\[ 8, 9, 10, 11\]\])arr["b"]  
array(\[\[ 0., 1., 2.\],  
\[ 3., 4., 5.\],  
\[ 6., 7., 8.\],  
\[ 9., 10., 11.\]\])
# 后缀都一样,你干脆当它和上面的没区别即可  
arr = np.load("data/c.npz")  
arr["b"]  
array(\[\[ 0., 1., 2.\], \[ 3., 4., 5.\], \[ 6., 7., 8.\], \[ 9., 10., 11.\]\]) \`\`

统计和属性

  • 本节我们从"array"的基本统计属性入手,对刚刚创建的"array"进一步的了解。主要包括以下几个方面:
  • 尺寸相关
  • 最大、最小、中位、分位值
  • 平均、求和、标准差等
都是描述性统计相关的指标,对于我们从整体了解一个 array 很有帮助。其中,用到最多的是尺寸相关的"shape",最大、最小值,平均值、求和等。
  • 本节的内容非常简单,您只需要特别关注(记住)两个重要的特性:
  • 按维度(指定 axis)求结果。一般0表示列1表示行,可以用「沿着行/列操作」这样理解,不确定时可以拿个例子试一下。
  • 计算后保持维度(“keepdims=True”)
另外,为了便于操作,我们使用一个随机生成的"array"作为操作对象;同时,我们指定了"seed",这样每次运行,每个人看到的结果都是一样的。一般我们在训练模型时,往往需要指定"seed",这样才能在「同等条件」下进行调参。
#  先创建一个 Generator  
rng = np.random.default_rng(seed=42)  
#  再生成一个均匀分布  
arr = rng.uniform(0, 1, (3, 4))  
arr  array(\[\[0.77395605, 0.43887844, 0.85859792, 0.69736803\], \[0.09417735, 0.97562235, 0.7611397 , 0.78606431\], \[0.12811363, 0.45038594, 0.37079802, 0.92676499\]\]) \`\`#### [](https://blog.csdn.net/m0_75067629/article/details/140042099?spm=1001.2014.3001.5502)尺寸相关
这一小节主要包括:维度、形状和数据量,其中形状"shape"我们用到的最多。
⚠️ 需要注意的是:size 不是 shape,ndim 表示有几个维度。
# 维度,array 是二维的(两个维度)  
arr.ndim  

np.shape

# 形状,返回一个 Tuple  
arr.shape  
# 数据量  
arr.size  

最值分位

  • 这一小节主要包括:最大值、最小值、中位数、其他分位数,其中『“最大值和最小值”』我们平时用到的最多。
  • ⚠️ 需要注意的是:分位数可以是 0-1 的任意小数(表示对应分位),而且分位数并不一定在原始的"array"中。
arr array(\[\[0.77395605, 0.43887844, 0.85859792, 0.69736803\],  
\[0.09417735, 0.97562235, 0.7611397 , 0.78606431\],  
\[0.12811363, 0.45038594, 0.37079802, 0.92676499\]\])# 所有元素中最大的  
arr.max()  0.9756223516367559

np.max/min

# 按维度(列)最大值  
arr.max(axis=0)  array(\[0.77395605, 0.97562235, 0.85859792, 0.92676499\])

同理,按行

arr.max(axis=1)  array(\[0.85859792, 0.97562235, 0.92676499\])

是否保持原来的维度

这个需要特别注意下,很多深度学习模型中都需要保持原有的维度进行后续计算
shape 是 (3,1),array 的 shape 是 (3,4),按行,同时保持了行的维度
arr.min(axis=1, keepdims=True)  array(\[\[0.43887844\],  
\[0.09417735\],  
\[0.12811363\]\])

保持维度:(1,4),原始array是(3,4)

arr.min(axis=0, keepdims=True)  array(\[\[0.09417735, 0.43887844, 0.37079802, 0.69736803\]\])

一维了

arr.min(axis=0, keepdims=False)  array(\[0.09417735, 0.43887844, 0.37079802, 0.69736803\])

另一种用法,不过我们一般习惯使用上面的用法,其实两者一回事

np.amax(arr, axis=0)  array(\[0.77395605, 0.97562235, 0.85859792, 0.92676499\])

同 amax

np.amin(arr, axis=1)  array(\[0.43887844, 0.09417735, 0.12811363\])

中位数

其他用法和 max,min 是一样的

np.median(arr)  0.7292538655248584

分位数,按列取1/4数
np.quantile(arr, q=0.25, axis=0)  array([0.11114549, 0.44463219, 0.56596886, 0.74171617])  

分位数,按行取 3/4,同时保持维度

np.quantile(arr, q=0.75, axis=1, keepdims=True)  array(\[\[0.79511652\],  
\[0.83345382\],  
\[0.5694807 \]\])

分位数,注意,分位数可以是 0-1 之间的任何数字(分位)

如果是 1/2 分位,那正好是中位数

np.quantile(arr, q=1/2, axis=1)array(\[0.73566204, 0.773602 , 0.41059198\]) \`\`#### [](https://blog.csdn.net/m0_75067629/article/details/140042099?spm=1001.2014.3001.5502)平均求和标准差
这一小节主要包括:平均值、累计求和、方差、标准差等进一步的统计指标。其中使用最多的是「平均值」。
array(\[\[0.77395605, 0.43887844, 0.85859792, 0.69736803\],  
\[0.09417735, 0.97562235, 0.7611397 , 0.78606431\],  
\[0.12811363, 0.45038594, 0.37079802, 0.92676499\]\])

np.averag

# 平均值  
np.average(arr)  0.6051555606435642

按维度平均(列)

np.average(arr, axis=0)  array(\[0.33208234, 0.62162891, 0.66351188, 0.80339911\])
另一个计算平均值的 API
它与 average 的主要区别是,np.average 可以指定权重,即可以用于计算加权平均
一般建议使用 average,忘掉 mean 吧!
np.mean(arr, axis=0)  array(\[0.33208234, 0.62162891, 0.66351188, 0.80339911\])##### [](https://blog.csdn.net/m0_75067629/article/details/140042099?spm=1001.2014.3001.5502)`np.sum`

求和,不多说了,类似

np.sum(arr, axis=1)  array(\[2.76880044, 2.61700371, 1.87606258\])np.sum(arr, axis=1, keepdims=True)  array(\[\[2.76880044\],  
\[2.61700371\],  
\[1.87606258\]\])

按列累计求和

np.cumsum(arr, axis=0)  array(\[\[0.77395605, 0.43887844, 0.85859792, 0.69736803\],  
\[0.8681334 , 1.41450079, 1.61973762, 1.48343233\],  
\[0.99624703, 1.86488673, 1.99053565, 2.41019732\]\])

按行累计求和

np.cumsum(arr, axis=1)  array(\[\[0.77395605, 1.21283449, 2.07143241, 2.76880044\],  
\[0.09417735, 1.0697997 , 1.8309394 , 2.61700371\],  
\[0.12811363, 0.57849957, 0.94929759, 1.87606258\]\])

标准差,用法类似

np.std(arr)  0.28783096517727075

按列求标准差

np.std(arr, axis=0)  array(\[0.3127589 , 0.25035525, 0.21076935, 0.09444968\])

方差

np.var(arr, axis=1)  array(\[0.02464271, 0.1114405 , 0.0839356 \])


最后

1.Python系统学习路线图
在这里插入图片描述

2.Python必备开发工具
在这里插入图片描述

3.看视频进行系统学习

  • 先在网上康康达人分享的视频、干货,通俗易懂,形成初始概念;你会发现博主们在进阶成大神之前他们的学习途径有哪些,找到适合自己风格的课程;
  • 不过这样学习技术比较杂乱,所以通过更加系统的视频来学习,效果更好,也更全面。

4.实战案例

  • 光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
    在这里插入图片描述
    图片

总结

  • 最后希望你编程学习上不急不躁,按照计划有条不紊推进,把任何一件事做到极致,都是不容易的,加油,努力!相信自己!

文末福利

  • 最后这里免费分享给大家一份Python全套学习资料,希望能帮到那些不满现状,想提升自己却又没有方向的朋友,也可以和我一起来学习交流呀。

包含编程资料、学习路线图、源代码、软件安装包等!【[点击这里]】领取!

  • ① Python所有方向的学习路线图,清楚各个方向要学什么东西
  • ② 100多节Python课程视频,涵盖必备基础、爬虫和数据分析
  • ③ 100多个Python实战案例,学习不再是只会理论
  • ④ 华为出品独家Python漫画教程,手机也能学习

可以扫描下方二维码领取【保证100%免费

在这里插入图片描述

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

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

相关文章

[AWS]RDS数据库版本升级

背景&#xff1a;由于AWS上mysql5.7版本不再支持&#xff0c;需要进行版本升级。 吐槽&#xff1a;每年都要来那么几次&#xff0c;真的有病一样&#xff0c;很烦。 步骤一、升级检查 AWS提供了一个python的升级检测脚本&#xff0c;可以按照一下脚本下载测试&#xff1a; [r…

Race Track Generator Ultimate:Race Track Generator(赛车场赛道看台场景创建工具)

下载&#xff1a;​​Unity资源商店链接资源下载链接 效果图&#xff1a;

SpringSecurity源码分析以及如何解决前后端分离出现的跨域问题

解决Security前后端分离出现的跨域问题 一. Security源码分析 首先在看源码之前我们先来看这张图 , 这张图展示了Security执行的全部流程 从上图可知Security执行的入口是UsernamePasswordAuthenticationFilter这个抽象类 , 那我们就先从该类进行分析 1. UsernamePasswordAu…

Jmeter简介

基础介绍 Jmeter录制脚本的原始是配置一个HTTP代理&#xff0c;然后浏览器通过这个代理访问测试页面从而完成脚本录制。 一、下载安装 jmeter本身不需要安装&#xff0c;需要配置环境变量JDK&#xff0c;然后打开bin文件夹中的jmeter.vbs即可。建议jdk 1.7及以上版本。 基本祖…

Python+Flask接口判断身份证省份、生日、性别、有效性验证+docker部署+Nginx代理运行

这里写目录标题 一、接口样式二、部署流程2.1 镜像打包2.1.1 准备工作2.1.2 build打包2.1.3 dokcer部署运行2.1.4 Nginx代理 三、代码及文件3.1 index.py3.2 areaCodes.json3.3 Dockerfile 一、接口样式 https://blog.henryplus.cn/idcardApi/idCard/query?idcard{idcard} 如果…

1.计算机网络_基本知识

基本知识 计算机网络的类别&#xff1a; 1、按作用范围来分类 2、按网络的使用者来分类 什么是计算机网络&#xff1a; 计算机网络由若干个节点和链接这些节点的链路组成&#xff0c;节点可以是计算机、集线器、交换机、路由器等。互联网络是多个网络通过路由器连接在了一起…

c语言基础程序——经典100道实例。

c语言基础程序——经典100道实例 001&#xff0c; 组无重复数字的数002&#xff0c;企业发放的奖金根据利润提成003&#xff0c;完全平方数004&#xff0c;判断当天是这一年的第几天005&#xff0c;三个数由小到大输出006&#xff0c;输出字母C图案007&#xff0c;特殊图案008&…

尊享挚爱之选:三好夫人高端养生茶,不仅仅是茶,更是爱的传递

三好夫人&#xff1a;吾扶丈夫凌云志&#xff0c;夫还贤妻万两金&#xff01; 在追求品质生活的道路上&#xff0c;一份贴心、高端的礼物&#xff0c;不仅能彰显品味&#xff0c;更能传递深情厚意。今天&#xff0c;就让我们一起走进“三好夫人”高端养生茶的世界&#xff0c;探…

DORA 机器人中间件学习教程(5)——3D激光雷达数据可视化

DORA中3D激光雷达数据可视化 1 总体思路2 DORA数据接收节点3 编写yml文件4 启动节点参考资料 截止目前 DORA还没有类似于ROS2中RVIZ这样的可视化工具&#xff0c;而在调试算法时我们又需要将数据进行可视化以验证代码的正确性。目前的解决方法是将DORA中的数据发送到ROS2中&…

vscode 远程linux服务器 连接git

vscode 远程linux服务器 连接git 1. git 下载2. git 配置1&#xff09;github 设置2&#xff09;与github建立连接linux端&#xff1a;创建密钥github端&#xff1a;创建ssh key 3. 使用1&#xff09;初始化repository2&#xff09;commit 输入本次提交信息&#xff0c;提交到本…

【Pycharm】显示内存不足the IDE is running low on memory解决方法

Pycharm提示显示内存不足the IDE is running low on memory解决方法 在右上角找到Help&#xff0c;点击&#xff0c;找到change memory settings 修改数值如1024&#xff0c;2048 等&#xff0c;增大容量即可。最后点击save and Restart

【Android】Jetpack入门知识总结(LifeCycle,ViewModel,LiveData,DataBinding等)

文章目录 LifeCycle使用Lifecycle解耦页面与组件自定义控件实现LifecycleObserver接口注册生命周期监听器 使用LifecycleService解耦Service与组件使用ProcessLifecycleOwner监听应用程序生命周期 ViewModel用法在 Fragment 中使用 ViewModel LiveDataDataBinding导入依赖基本用…

2024_E_100_连续字母长度

连续字母长度 题目描述 给定一个字符串&#xff0c;只包含大写字母&#xff0c;求在包含同一字母的子串中&#xff0c;长度第 k 长的子串的长度&#xff0c;相同字母只取最长的那个子串。 输入描述 第一行有一个子串(1<长度<100)&#xff0c;只包含大写字母。 第二行为…

傅里叶分析之掐死教程(完整版)更新于2014.06.06

作 者&#xff1a;韩 昊 知 乎&#xff1a;Heinrich 微 博&#xff1a;花生油工人 知乎专栏&#xff1a;与时间无关的故事 谨以此文献给大连海事大学的吴楠老师&#xff0c;柳晓鸣老师&#xff0c;王新年老师以及张晶泊老师。 转载的同学请保留上面这句话&#xff0c;谢谢。如果…

stable diffusion WEBUI Brief summary

1&#xff0c;rembg(去除背景-》蒙版) import rembg from PIL import Image, ImageOps import numpy as np# 打开图像 input_path "./p_6258838.jpg" input_image Image.open(input_path)# 移除背景&#xff0c;得到带有透明背景的图像 output_image rembg.remove…

IO编程--两进程间的实时通信

一、使用有名管道实现两个进程之间的相互通信 代码如下&#xff1a; 创建有名管道文件 #include <myhead.h> int main(int argc, const char *argv[]) {if(mkfifo("myfifo",0664)-1){perror("create error");return -1;}if(mkfifo("myfifo_1&qu…

UDP/TCP协议详解

目录 一,自定义应用层协议: 1)xml 2),JSON 3),yml 4),google protobuffer 二,传输层UDP/TCP: UDP协议: TCP协议: TCP的核心机制一:确认应答 TCP核心机制二:超时重传 TCP核心机制三:连接管理 TCP核心机制四:滑动窗口 TCP核心机制五:流量控制 TCP核心机制六:拥塞控制…

基于springboot的网上服装购物商城系统

基于springboot的网上服装购物商城系统 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;idea 源码获取&#xff1a; &#x…

Video-LLaMA论文解读和项目部署教程

Video-LLaMA: An Instruction-tuned Audio-Visual Language Model for Video Understanding 相关工作 大型语言模型: 本文的工作基于这些LLM,并提供即插即用插件,使其能够理解视频中的视觉和听觉内容。 多模态大型语言模型: 现有的方法可以分为两大类。 第一类包括使用LL…