Python NumPy 库详解
大家好,在当今数据驱动的世界中,处理大规模数据、进行复杂数值计算是科学研究、工程设计以及数据分析的关键任务之一。在Python生态系统中,NumPy(Numerical Python)库是一款备受推崇的工具,它为我们提供了高效的数组操作、数学函数以及线性代数运算等功能,成为了科学计算和数据处理的利器。
一、介绍 NumPy
NumPy(Numerical Python)是Python中一个开源的数值计算库,它为Python提供了支持多维数组和矩阵运算的高效工具,同时也提供了许多数学函数库。NumPy由Travis Oliphant于2005年创建,目前由社区驱动,并且是许多科学和工程领域中最受欢迎的Python库之一。
NumPy的优势
1. 高效的数组操作
NumPy的核心是一个称为ndarray
的多维数组对象,它可以存储相同类型的数据,并且支持高效的元素级操作。与Python的原生列表相比,NumPy数组的操作速度更快,这是因为NumPy数组在底层使用了C语言实现,并且采用了预编译的代码优化技术。
2. 广播功能
NumPy的广播功能使得对不同形状的数组进行运算变得更加容易和高效。在进行算术运算、逻辑运算或者其他数组操作时,NumPy会自动调整参与运算的数组的形状,使其能够兼容,从而简化了代码编写和理解。
3. 强大的线性代数运算
NumPy提供了丰富的线性代数函数和运算符,可以进行矩阵乘法、矩阵求逆、特征值与特征向量计算等操作。这些功能对于科学计算、信号处理、图像处理等领域的数学建模和计算非常有用。
4. 数学函数库
NumPy还包含了大量的数学函数,包括三角函数、指数函数、对数函数、统计函数等。这些函数可以直接应用于NumPy数组,极大地方便了科学计算和数据处理任务的实现。
5. 广泛的应用领域
由于NumPy具有高效的数组操作、广播功能和丰富的数学函数库,它在科学计算、工程建模、数据分析、机器学习等领域都得到了广泛的应用。许多其他Python库和工具,如SciPy、Pandas、Matplotlib等都是基于NumPy构建的,这使得NumPy成为了Python生态系统中不可或缺的一部分。
NumPy是Python中的一个强大的数值计算库,它提供了高效的数组操作、广播功能、线性代数运算等功能,使得Python成为了一种强大的科学计算和数据处理工具。无论是进行基础的数值计算,还是进行复杂的科学研究,NumPy都能够为您提供便利和高效的解决方案。
二、数组创建与基本操作
当创建和操作NumPy数组时,有几种基本的操作可以帮助你轻松地处理数据。下面是对数组创建与基本操作的详细介绍以及相应的示例:
1. 数组创建
从Python列表创建数组:
import numpy as np# 从Python列表创建一维数组
arr1 = np.array([1, 2, 3, 4, 5])
print("一维数组:", arr1)# 从Python列表创建二维数组
arr2 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print("二维数组:\n", arr2)
从元组创建数组:
import numpy as np# 从元组创建一维数组
arr1 = np.array((1, 2, 3, 4, 5))
print("一维数组:", arr1)# 从元组创建二维数组
arr2 = np.array(((1, 2, 3), (4, 5, 6), (7, 8, 9)))
print("二维数组:\n", arr2)
2. 数组基本操作
索引与切片:
import numpy as nparr = np.array([1, 2, 3, 4, 5])# 获取数组中的第三个元素
print("第三个元素:", arr[2])# 获取数组中的第二到第四个元素(切片操作)
print("第二到第四个元素:", arr[1:4])
形状修改:
import numpy as nparr = np.array([[1, 2, 3], [4, 5, 6]])# 获取数组形状
print("数组形状:", arr.shape)# 修改数组形状为(3,2)
arr_reshaped = arr.reshape(3, 2)
print("修改形状后的数组:\n", arr_reshaped)
3. 多维数组创建与操作
创建多维数组:
import numpy as np# 创建一个3x3的全零数组
zeros_arr = np.zeros((3, 3))
print("全零数组:\n", zeros_arr)# 创建一个3x3的全一数组
ones_arr = np.ones((3, 3))
print("全一数组:\n", ones_arr)# 创建一个3x3的单位矩阵
identity_arr = np.eye(3)
print("单位矩阵:\n", identity_arr)# 创建一个3x3的随机数组
random_arr = np.random.rand(3, 3)
print("随机数组:\n", random_arr)
多维数组索引与切片:
import numpy as nparr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])# 获取数组中的第一行
print("第一行:", arr[0])# 获取数组中的第一列
print("第一列:", arr[:, 0])# 获取数组中的子数组
print("子数组:\n", arr[:2, 1:])
多维数组形状修改:
import numpy as nparr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])# 将数组展平为一维数组
flattened_arr = arr.flatten()
print("展平后的数组:", flattened_arr)# 将数组转置
transposed_arr = arr.T
print("转置后的数组:\n", transposed_arr)
4. 创建特定范围的数组
使用arange()
创建等差数列:
import numpy as np# 创建一个从0到9的整数序列
arr1 = np.arange(10)
print("arange()创建的数组:", arr1)# 创建一个从1到9,步长为2的整数序列
arr2 = np.arange(1, 10, 2)
print("带步长的arange()创建的数组:", arr2)
使用linspace()
创建等间隔数列:
import numpy as np# 创建一个从0到1之间,分为5个间隔的数列
arr = np.linspace(0, 1, 5)
print("linspace()创建的数组:", arr)
5. 数组的堆叠与重复
垂直堆叠(vstack()
)和水平堆叠(hstack()
):
import numpy as nparr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])# 垂直堆叠
vertical_stack = np.vstack((arr1, arr2))
print("垂直堆叠:\n", vertical_stack)# 水平堆叠
horizontal_stack = np.hstack((arr1, arr2))
print("水平堆叠:\n", horizontal_stack)
数组的重复与复制:
import numpy as nparr = np.array([1, 2, 3])# 重复数组元素
repeated_arr = np.repeat(arr, 3)
print("重复数组元素:", repeated_arr)# 复制数组
copied_arr = np.tile(arr, 3)
print("复制数组:", copied_arr)
6. 数组的形状操作与改变
改变数组的形状:
import numpy as nparr = np.arange(9)# 将一维数组改变为3x3的二维数组
reshaped_arr = arr.reshape(3, 3)
print("修改形状后的数组:\n", reshaped_arr)# 展平多维数组
flattened_arr = reshaped_arr.flatten()
print("展平后的数组:", flattened_arr)
以上示例展示了如何使用NumPy创建数组以及对数组进行基本操作,包括索引、切片和形状修改。这些操作是使用NumPy进行数据处理和分析的基础,熟练掌握它们将有助于您更好地处理和操作数据。
三、数组操作与计算
当进行数组操作与运算时,NumPy提供了丰富的功能和方法,包括算术运算、逻辑运算、统计函数等。同时,NumPy的广播功能能够使得不同形状的数组在进行运算时具有良好的兼容性,从而简化了代码的编写和理解。接下来,我将详细介绍这些内容,并提供相应的示例:
1. 数组的算术运算
加法、减法、乘法、除法:
import numpy as nparr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])# 加法
add_result = arr1 + arr2
print("加法结果:\n", add_result)# 减法
sub_result = arr1 - arr2
print("减法结果:\n", sub_result)# 乘法
mul_result = arr1 * arr2
print("乘法结果:\n", mul_result)# 除法
div_result = arr1 / arr2
print("除法结果:\n", div_result)
2. 数组的逻辑运算
大于、小于、等于:
import numpy as nparr1 = np.array([1, 2, 3])
arr2 = np.array([2, 2, 2])# 大于
greater_result = arr1 > arr2
print("大于结果:", greater_result)# 小于
less_result = arr1 < arr2
print("小于结果:", less_result)# 等于
equal_result = arr1 == arr2
print("等于结果:", equal_result)
3. 数组的统计函数
求和、均值、最大值、最小值:
import numpy as nparr = np.array([[1, 2], [3, 4]])# 求和
sum_result = np.sum(arr)
print("数组求和:", sum_result)# 均值
mean_result = np.mean(arr)
print("数组均值:", mean_result)# 最大值
max_result = np.max(arr)
print("数组最大值:", max_result)# 最小值
min_result = np.min(arr)
print("数组最小值:", min_result)
4. 广播功能的应用
手动扩展数组维度:
import numpy as nparr = np.array([1, 2, 3])
scalar = 10# 手动扩展数组维度
expanded_arr = arr[:, np.newaxis]
print("扩展后的数组:\n", expanded_arr)# 使用广播功能进行加法运算
broadcasted_addition = expanded_arr + scalar
print("广播加法运算结果:\n", broadcasted_addition)
5. 数组的矩阵运算
NumPy中提供了丰富的线性代数函数,可以进行矩阵乘法、矩阵求逆、特征值与特征向量计算等操作。
矩阵乘法:
import numpy as nparr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])# 矩阵乘法
matrix_multiply_result = np.dot(arr1, arr2)
print("矩阵乘法结果:\n", matrix_multiply_result)
矩阵求逆:
import numpy as nparr = np.array([[1, 2], [3, 4]])# 矩阵求逆
inverse_result = np.linalg.inv(arr)
print("矩阵求逆结果:\n", inverse_result)
6. 高级数组操作
排序:
import numpy as nparr = np.array([3, 1, 2])# 对数组进行排序
sorted_arr = np.sort(arr)
print("排序后的数组:", sorted_arr)
去重:
import numpy as nparr = np.array([1, 2, 2, 3, 3, 3])# 去重
unique_values = np.unique(arr)
print("去重后的数组:", unique_values)
7. 特征值与特征向量
特征值和特征向量是矩阵在线性代数中的重要概念,它们能够描述矩阵的行为和性质。在NumPy中,可以使用np.linalg.eig()
函数来计算矩阵的特征值和特征向量。
import numpy as nparr = np.array([[1, 2], [2, 1]])# 计算特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(arr)
print("特征值:", eigenvalues)
print("特征向量:\n", eigenvectors)
四、随机数生成
NumPy中的随机数生成模块(numpy.random)提供了各种生成随机数的函数,可以生成服从不同分布的随机数序列,如均匀分布、正态分布等。此外,通过设置随机数种子,可以确保随机数的可重复性,这在实验复现和调试代码时非常有用。让我们详细了解一下这些功能,并提供相应的示例:
1. 生成均匀分布的随机数
可以使用numpy.random.rand()
函数生成[0, 1)之间的均匀分布随机数。
import numpy as np# 生成一个形状为(3, 3)的均匀分布随机数数组
uniform_random_array = np.random.rand(3, 3)
print("均匀分布随机数数组:\n", uniform_random_array)
2. 生成正态分布的随机数
使用numpy.random.randn()
函数可以生成服从标准正态分布(均值为0,标准差为1)的随机数。
import numpy as np# 生成一个形状为(3, 3)的正态分布随机数数组
normal_random_array = np.random.randn(3, 3)
print("正态分布随机数数组:\n", normal_random_array)
3. 设置随机数种子
通过设置随机数种子,可以确保每次生成的随机数序列是确定性的,从而方便代码的调试和实验结果的复现。
import numpy as np# 设置随机数种子为1
np.random.seed(1)# 生成随机数
random_num = np.random.rand()
print("随机数:", random_num)
4. 生成整数随机数
使用numpy.random.randint()
函数可以生成指定范围内的整数随机数。
import numpy as np# 生成一个范围在[0, 10)之间的整数随机数数组,形状为(3, 3)
int_random_array = np.random.randint(0, 10, size=(3, 3))
print("整数随机数数组:\n", int_random_array)
5. 生成其他分布的随机数
NumPy还提供了其他分布的随机数生成函数,如指数分布、泊松分布等,可以根据具体需求选择合适的函数。
import numpy as np# 生成一个形状为(3, 3)的指数分布随机数数组
exponential_random_array = np.random.exponential(scale=2, size=(3, 3))
print("指数分布随机数数组:\n", exponential_random_array)
6. 随机抽样
NumPy中提供了一些函数用于从给定的一维数组中进行随机抽样,比如numpy.random.choice()
函数。
import numpy as np# 从给定的一维数组中进行随机抽样,抽样结果包含重复元素
arr = np.array([1, 2, 3, 4, 5])
random_sample = np.random.choice(arr, size=3)
print("随机抽样结果:", random_sample)
7. 随机数的排列
有时候需要对一维数组进行随机排列,可以使用numpy.random.shuffle()
函数。
import numpy as np# 对一维数组进行随机排列
arr = np.array([1, 2, 3, 4, 5])
np.random.shuffle(arr)
print("随机排列结果:", arr)
8. 高级的随机数生成
NumPy中还提供了一些高级的随机数生成函数,如numpy.random.multivariate_normal()
用于生成多元正态分布随机数等。
import numpy as np# 生成一个二维正态分布随机数数组,其中mean表示均值,cov表示协方差矩阵
mean = [0, 0]
cov = [[1, 0.5], [0.5, 1]]
multivariate_normal_random_array = np.random.multivariate_normal(mean, cov, size=5)
print("多元正态分布随机数数组:\n", multivariate_normal_random_array)
五、数组的索引与切片技巧
数组的索引与切片技巧在NumPy中是非常重要的,它们可以帮助你高效地访问和操作数组的元素。除了普通的整数索引和切片操作外,NumPy还提供了一些高级的索引与切片技巧,如布尔索引、花式索引等。让我们详细讨论一下这些技巧,并提供相应的示例:
1. 布尔索引
布尔索引是通过布尔数组来获取数组中满足条件的元素。可以使用布尔运算符(如&
、|
、~
)结合比较运算符来创建布尔数组,然后将其作为索引应用于原始数组。
import numpy as nparr = np.array([1, 2, 3, 4, 5])# 使用布尔索引获取数组中大于2的元素
boolean_index = arr > 2
result = arr[boolean_index]
print("布尔索引结果:", result)
2. 花式索引
花式索引是通过指定索引数组来获取数组中指定位置的元素。可以使用整数数组或者布尔数组作为索引。
使用整数数组作为索引:
import numpy as nparr = np.array([1, 2, 3, 4, 5])# 使用整数数组作为索引获取数组中指定位置的元素
index_array = np.array([0, 2, 4])
result = arr[index_array]
print("花式索引结果:", result)
使用布尔数组作为索引:
import numpy as nparr = np.array([1, 2, 3, 4, 5])# 使用布尔数组作为索引获取数组中满足条件的元素
boolean_index = np.array([True, False, True, False, True])
result = arr[boolean_index]
print("花式索引结果:", result)
3. 多维数组的索引与切片
对于多维数组,可以对每个维度进行索引和切片操作,以实现更精细的数据选择。
import numpy as nparr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])# 获取数组中的第二行
row = arr[1]
print("第二行:", row)# 获取数组中的第二列
col = arr[:, 1]
print("第二列:", col)# 获取数组中的子矩阵
submatrix = arr[:2, 1:]
print("子矩阵:\n", submatrix)
4. 使用np.newaxis
扩展数组维度
np.newaxis
是一个用于在数组中插入新维度的特殊索引对象。
import numpy as nparr = np.array([1, 2, 3])# 扩展数组维度
new_arr = arr[:, np.newaxis]
print("扩展后的数组:\n", new_arr)
5. 使用np.ix_()
进行多维数组索引
np.ix_()
函数可以帮助我们实现多维数组的交叉索引,非常方便。
import numpy as nparr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])# 使用 np.ix_() 进行多维数组索引
indices = np.ix_([0, 2], [1, 2])
result = arr[indices]
print("多维数组索引结果:\n", result)
6. 使用布尔索引进行元素的修改和赋值
可以利用布尔索引来选择满足条件的数组元素,并对其进行修改或赋值。
import numpy as nparr = np.array([1, 2, 3, 4, 5])# 使用布尔索引选择满足条件的元素,并进行修改赋值
boolean_index = arr > 3
arr[boolean_index] = 0
print("修改后的数组:", arr)
7. 使用切片进行数组的修改和赋值
切片不仅可以用于选择数组的子集,还可以用于对数组的子集进行修改或赋值。
import numpy as nparr = np.array([1, 2, 3, 4, 5])# 使用切片选择数组的子集,并进行修改赋值
arr[1:4] = 0
print("修改后的数组:", arr)
六、性能优化与并行计算
性能优化与并行计算是在处理大规模数据和复杂计算时必不可少的考虑因素。NumPy提供了一些方法来优化代码性能,同时可以与并行计算库(如Numba、Dask等)配合使用以提升计算效率。让我们详细了解一下这些内容,并提供相应的示例:
1. 性能优化方法
使用向量化操作
NumPy的向量化操作能够利用底层优化库(如BLAS、LAPACK)来加速数组计算,避免使用显式循环。
import numpy as np# 使用向量化操作计算数组元素的平方和
arr = np.random.rand(1000000)
result = np.sum(arr ** 2)
print("向量化操作结果:", result)
避免创建不必要的中间数组
在进行复杂计算时,尽量避免创建不必要的中间数组,可以节省内存空间和计算时间。
import numpy as np# 避免创建不必要的中间数组
arr1 = np.random.rand(1000)
arr2 = np.random.rand(1000)
result = np.dot(arr1, arr2)
print("避免中间数组的计算结果:", result)
2. 并行计算与加速库配合使用
使用Numba进行加速
Numba是一个开源的即时编译器,可以将Python函数编译成高性能的机器码,从而提高代码的执行速度。
import numpy as np
from numba import jit# 使用Numba加速计算
@jit
def compute_sum(arr):return np.sum(arr ** 2)arr = np.random.rand(1000000)
result = compute_sum(arr)
print("Numba加速计算结果:", result)
使用Dask进行并行计算
Dask是一个用于并行计算的灵活库,可以处理比内存更大的数据集,并利用多核处理器或集群进行并行计算。
import numpy as np
import dask.array as da# 使用Dask进行并行计算
arr = da.random.random((1000000,))
result = (arr ** 2).sum()
print("Dask并行计算结果:", result.compute())
3. 使用并行计算库优化大规模数据处理
大规模数据的并行计算
import numpy as np
import dask.array as da# 生成一个大规模数据集
arr = da.random.random((10000000,))# 并行计算
result = (arr ** 2).sum()
print("大规模数据的并行计算结果:", result.compute())
七、实例与应用
NumPy在数据分析、科学计算等领域有着广泛的应用。让我们通过一些实际案例或示例来说明NumPy在不同领域的应用:
1. 数据处理
数据统计与分析
NumPy提供了丰富的统计函数,可以帮助我们对数据进行统计分析,如计算均值、标准差、中位数等。
import numpy as np# 生成一组随机数据
data = np.random.rand(1000)# 计算均值
mean = np.mean(data)# 计算标准差
std_deviation = np.std(data)# 计算中位数
median = np.median(data)print("均值:", mean)
print("标准差:", std_deviation)
print("中位数:", median)
数据清洗与预处理
NumPy可以帮助我们对数据进行清洗和预处理,如去除缺失值、数据标准化等。
import numpy as np# 生成一组带有缺失值的数据
data = np.array([1, 2, np.nan, 4, 5])# 去除缺失值
cleaned_data = data[~np.isnan(data)]# 数据标准化
normalized_data = (cleaned_data - np.mean(cleaned_data)) / np.std(cleaned_data)print("清洗后的数据:", cleaned_data)
print("标准化后的数据:", normalized_data)
2. 图像处理
图像滤波
NumPy可以用于图像处理,比如实现简单的图像滤波操作。
import numpy as np
import matplotlib.pyplot as plt
from scipy import misc# 读取图像
image = misc.face(gray=True)# 定义一个简单的平滑滤波器
filter_kernel = np.ones((3, 3)) / 9# 使用卷积操作进行图像滤波
filtered_image = np.convolve(image, filter_kernel, mode='same')# 绘制原始图像和滤波后的图像
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.imshow(image, cmap='gray')
plt.title('Original Image')
plt.subplot(1, 2, 2)
plt.imshow(filtered_image, cmap='gray')
plt.title('Filtered Image')
plt.show()
3. 信号处理
信号滤波
NumPy可以用于信号处理,比如实现数字信号的滤波操作。
import numpy as np
import matplotlib.pyplot as plt# 生成一个含噪声的信号
t = np.linspace(0, 1, 1000)
signal = np.sin(2 * np.pi * 5 * t) + 0.5 * np.random.randn(1000)# 设计一个低通滤波器
cutoff_frequency = 10
filter_order = 4
b, a = signal.butter(filter_order, cutoff_frequency, 'low')# 使用滤波器对信号进行滤波
filtered_signal = signal.filtfilt(b, a, signal)# 绘制原始信号和滤波后的信号
plt.figure(figsize=(10, 5))
plt.plot(t, signal, label='Original Signal')
plt.plot(t, filtered_signal, label='Filtered Signal')
plt.xlabel('Time')
plt.ylabel('Amplitude')
plt.title('Signal Filtering')
plt.legend()
plt.show()
相关文章:

Python NumPy 库详解
大家好,在当今数据驱动的世界中,处理大规模数据、进行复杂数值计算是科学研究、工程设计以及数据分析的关键任务之一。在Python生态系统中,NumPy(Numerical Python)库是一款备受推崇的工具,它为我们提供了高…...
React state 执行时机
设置 state 只会为下一次渲染变更 state 的值 一个 state 变量的值永远不会在一次渲染的内部发生变化 React 会使 state 的值始终"固定"在一次渲染的各个事件处理函数内部 React 会等到事件处理函数中的所有代码都运行完毕再处理 state 更新 在一个函数中࿰…...

Spring基于注解开发
目录 一. Bean基本注解开发 二. Bean依赖注入注解开发 三. 非自定义Bean注解开发 四. Spring配置类的开发 五. Spring配置其他注解 5.1 Primary 5.2 Profile 六. Spring注入的解析原理 七. Spring注解方式整合第三方框架 一. Bean基本注解开发 Spring除了xml配置文件…...
深度探索:智能家居背后的科技力量与伦理思考
目录 科技力量:创新驱动下的智慧生活引擎 1. 人工智能与机器学习 2. 物联网技术 3. 大数据分析 4. 5G与边缘计算 伦理与隐私:智能家居的双刃剑 1. 隐私侵犯风险 2. 数据安全挑战 3. 算法偏见与决策透明度 应对策略:构建安全、负责任的智能…...

鸿蒙开发:通过startAbilityByType拉起垂类应用
通过startAbilityByType拉起垂类应用 使用场景 开发者可通过特定的业务类型如导航、金融等,调用startAbilityByType接口拉起对应的垂域面板,该面板将展示目标方接入的垂域应用,由用户选择打开指定应用以实现相应的垂类意图。垂域面板为调用…...
docker 更换镜像源
打开对应的配置文件 vi /etc/docker/daemon.json 输入文件内容入下 {"registry-mirrors": ["https://registry.docker-cn.com","http://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8…...

Springboot(若依)国际化配置接口访问后返回????????
最近使用若依的框架进行二次开发,配置了国际化,application.yml配置英文时没问题,但配置中文basename: i18n/messages_zh_CN,访问接口就直接返回的???,如图: 于是检查了I18nConfig文件,没配错…...
java1
在继承中,创建子类对象,访问成员方法的规则: 创建的对象是谁,就优先用谁,没有再向上找 注意:无论是成员变量还是成员方法, 如果没有都是向上找父类,不会向下找子类 继承的特点&#…...

pytest中一个场景测试的demo
注意点1: allure.severity 是一个装饰器,用于设置测试用例的严重性级别。 allure.severity_level.CRITICAL 是Allure提供的严重性级别之一,表示这个测试用例极为重要。allure.severity_level.BLOCKER:阻塞级别的问题,…...
windows下安装IntelliJIDEA
windows下安装IntelliJIDEA 步骤1:下载IntelliJ IDEA 打开浏览器并访问IntelliJ IDEA下载页面. https://www.jetbrains.com/idea/download/选择合适的版本: Ultimate:付费版本,包含更多功能,适合专业开发。Community…...

string经典题目(C++)
文章目录 前言一、最长回文子串1.题目解析2.算法原理3.代码编写 二、字符串相乘1.题目解析2.算法原理3.代码编写 总结 前言 一、最长回文子串 1.题目解析 给你一个字符串 s,找到 s 中最长的回文子串。 示例 1: 输入:s “babad” 输出&am…...

三篇卫星切换的论文
目录 一、Energy-Aware Satellite Handover based on Deep Reinforcement Learning 1、题目翻译 2、来源 3、内容 二、A Reliable Handover Strategy with Second Satellite Selection in LEO Satellite Networks 1、题目翻译 2、来源 3、内容 三、User Grouping-Based…...

VUE之重定向redirect
VUE之路由和重定向redirect 这个小知识点是在学习做项目的时候遇到的一个问题,借鉴了一个他人的项目,是一个酒店管理系统,拿到源码之后导到我的vscode里。 参考链接 导的过程比较顺利,正常安装,加依赖,没有…...
服务器时区与数据库时区不一致导致时间bug记录
1、背景 一个活动,需要按照自然月刷新,每月一期,以活动开始当月作为第一期,每期可配置不同数据。问题出现在:活动开始时间为本月,但是查询用户数据发现当前为第二期,反复查看代码,确…...
华为鸿蒙HarmonyOS应用开发者高级认证题库
判断题 1、云函数打包完成后,需要到AppGallery Connect创建对应函数的触发器才可以在端侧中调用 错 2、在column和Row容器组件中,aligntems用于设置子组件在主轴方向上的对齐格式,justifycontent用于设置子组件在交叉轴方向上的对齐格式 错…...

细说MCU串口函数及使用printf函数实现串口发送数据的方法
目录 1、硬件及工程 2、串口相关的库函数 (1)串口中断服务函数: (2)串口接收回调函数: (3)串口接收中断配置函数: (4)非中断发送ÿ…...

PBox iOS端的应用隐藏、图片视频加密软件
哈喽,大家下午好!相信大家的手机中一定存在很多的私密内容,比如软件、照片、视频或者文档文件,很多都是不方便让外人看到的,此时就需要一款隐藏工具,市面上这类软件大部分都是收费的,应大家的需…...

【QT5】<总览五> QT多线程、TCP/UDP
文章目录 前言 一、QThread多线程 二、QT中的TCP编程 1. TCP简介 2. 服务端程序编写 3. 客户端程序编写 4. 服务端与客户端测试 三、QT中的UDP编程 1. UDP简介 2. UDP单播与广播程序 前言 承接【QT5】<总览四> QT常见绘图、图表及动画。若存在…...

fastadmin/thinkPHPQueue消息队列详细教程
thinkphp-queue 是thinkphp 官方提供的一个消息队列服务,它支持消息队列的一些基本特性: 消息的发布,获取,执行,删除,重发,失败处理,延迟执行,超时控制等队列的多队列, 内存限制 ,启动,停止,守护等消息队列可降级为同步执行1、通过composer安装thinkPHP消息队列 …...

社区新标准发布!龙蜥社区标准化 SIG MeetUp 圆满结束
5 月 31 日,「龙蜥社区“走进系列”」第 9 期之走进阿里云于北京圆满结束。来自阿里云、浪潮信息、红旗软件、中兴通讯|中兴新支点、中科曙光、中科方德、统信软件、麒麟软件、万里红、普华基础软件、飞腾信息、凝思、申威、新华三等公司的 30 余位专家出席会议。会…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
pycharm 设置环境出错
pycharm 设置环境出错 pycharm 新建项目,设置虚拟环境,出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...

spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...

未授权访问事件频发,我们应当如何应对?
在当下,数据已成为企业和组织的核心资产,是推动业务发展、决策制定以及创新的关键驱动力。然而,未授权访问这一隐匿的安全威胁,正如同高悬的达摩克利斯之剑,时刻威胁着数据的安全,一旦触发,便可…...

在MobaXterm 打开图形工具firefox
目录 1.安装 X 服务器软件 2.服务器端配置 3.客户端配置 4.安装并打开 Firefox 1.安装 X 服务器软件 Centos系统 # CentOS/RHEL 7 及之前(YUM) sudo yum install xorg-x11-server-Xorg xorg-x11-xinit xorg-x11-utils mesa-libEGL mesa-libGL mesa-…...

信息收集:从图像元数据(隐藏信息收集)到用户身份的揭秘 --- 7000
目录 🌐 访问Web服务 💻 分析源代码 ⬇️ 下载图片并保留元数据 🔍 提取元数据(重点) 👤 生成用户名列表 🛠️ 技术原理 图片元数据(EXIF 数据) Username-Anarch…...