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()

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

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

相关文章

PHP调用快递地址解析接口助力项目优化

快递地址智能解析是日常开发中一个重要的工具&#xff0c;可以帮助快递公司提高效率&#xff0c;减少错误&#xff0c;进行数据分析。也可以帮助网购用户快速输入收货地址&#xff0c;提升用户体验。 看完以下操作文档&#xff0c;可以让你在开发中以最快时间完成这个功能&…

mybatis 之 DatabaseIdProvider 教程

mybatis之DatabaseIdProvider 应用中可能同时涉及到多个数据库&#xff0c;比如MySQL&#xff0c;oracle等等&#xff0c;那么当我们使用mybatis的时候&#xff0c;怎么做到动态切换呢&#xff1f;DatabaseIdProvider 可以帮助我们 public interface DatabaseIdProvider {def…

取消el-time-picker组件在Sarari浏览器中下拉回弹效果

在项目中用到el-time-picker组件来选择时间&#xff0c; 但是在Safari浏览器中&#xff0c;滑动分钟列表时&#xff0c;会取消时钟的选择&#xff0c;这是因为滑动分钟列表时有一个回弹效果&#xff0c;回弹把时钟的选择给取消掉了&#xff0c;我们现在要做的就是取消滑动时钟时…

谷歌配置邮箱stmp开发

谷歌的stmp开发&#xff0c;需要一个专用密码 首先要打开二部验证 然后再通过这个链接&#xff0c;创建专用密码 https://myaccount.google.com/u/6/apppasswords?gar1 然后拿专用密码去写在代码上&#xff0c;谷歌发邮件&#xff0c;不知道是不是国内还是什么原因&#xff…

Java-开发技巧

1.判断list或者map 用org.apache.commons.collections4包下的 CollectionUtils.isNotEmpty 2.判断字符串 用org.apache.commons.lang3包下的 StringUtils 3.执行分组操作&#xff0c;List<StatusDAO>不会为null情况 Map<LocalDateTime,List<StatusDAO>> …

Centos上部署Node服务和MongoDB

文章目录 1.Centos上安装运行Node服务1. 安装Node.js2.验证Node.js安装3.运行Node.js应用程序4.调试Node.js应用 2.Centos上安装MongoDB3.创建Node服务1.配置初始化文件2.创建index.js文件3.启动服务3.配置公网访问forever的引入pm2的引入 4.应对CORS跨域使用cors中间件手动设置…

深入理解MySQL分区技术

前言&#xff1a; 在数据量不断增长的当今时代&#xff0c;数据库的性能优化变得尤为重要。MySQL作为一款广泛使用的数据库管理系统&#xff0c;提供了多种性能优化手段&#xff0c;其中分区技术是提升大型表处理效率的有效方法之一。通过将数据分散到多个独立的物理子表中&am…

《大道平渊》· 拾叁 —— 失眠?忍不住乱想?不如反其道而行之!

《平渊》 拾叁 "睡觉的时候就是要胡思乱想" 声明&#xff1a;以下内容针对非失眠症人群&#xff0c;如果失眠不是偶尔发生&#xff0c;而是长期存在&#xff0c;以下内容和你无关&#xff0c;请尽早治疗&#xff0c;遵循医嘱。 失眠的本质是什么&#xff1f;心理因素…

C++并发之锁(std::lock_guard,std::unique_lock)

目录 1 概述2 使用实例3 接口使用3.1 lock_guard3.2 adopt_lock3.3 defer_lock3.4 try_to_lock3.5 try_lock3.6 release3.7 lock3.8 call_one1 概述 锁保护是通过使互斥对象始终处于锁定状态来管理互斥对象的对象。。   在构造时,互斥对象被调用线程锁定,在析构时,互斥被解…

Qt实现信号与槽,模拟Qt的信号与槽,观察者模式

运行在VS2022&#xff0c;x86&#xff0c;Debug下 33. Qt信号与槽 实现原理&#xff1a;观察者模式&#xff0c;即当一个对象被修改时&#xff0c;就会自动通知依赖它的对象。应用&#xff1a;对象间的通信。 33.1. Qt实现信号与槽&#xff0c;代码如下。 #include <QOb…

电脑撤回的快捷键是什么?

下面给大家介绍了各种办公应用的撤回以及反向撤回快捷键介绍&#xff0c;在ps、excel中都是可以使用的。 撤回键是ctrl加什么 1、撤销的快捷键是“CtrlZ”&#xff0c;用于取消上一步操作&#xff0c;对与在电脑系统上或软件内的操作均适用。重复按下可以取消多步操作。 2、而…

乡村振兴的法治保障:加强农村法治建设,完善乡村治理体系,提高农民法治素养,为美丽乡村建设提供有力保障

目录 一、引言 二、加强农村法治建设的必要性 &#xff08;一&#xff09;法治是乡村振兴的基石 &#xff08;二&#xff09;法治是乡村治理的保障 &#xff08;三&#xff09;法治是农民权益的守护者 三、完善乡村治理体系的路径 &#xff08;一&#xff09;加强乡村基…

Talk|CVPR‘24 Oral:超越3D - Point Transformer V3中的多模态特征提取新构想

本期为TechBeat人工智能社区第599期线上Talk。 北京时间6月12日(周三)20:00&#xff0c;香港大学博士生—吴虓杨的Talk已经准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “超越3D - Point Transformer V3中的多模态特征提取新构想”&#xff0c;他通过P…

用教育邮箱在官网安装origin2024中文版教程

打开origin官网&#xff0c;点击learning Edition&#xff0c;教育版只能维持六个月&#xff0c;但是过期之后可以在官网更新&#xff0c;能够免费使用六次&#xff0c;也就是三年。 OriginLab - Origin and OriginPro - Data Analysis and Graphing Software 填写学校信息&…

Java应届第一年规划

&#x1f47d;System.out.println(“&#x1f44b;&#x1f3fc;嗨&#xff0c;大家好&#xff0c;我是代码不会敲的小符&#xff0c;目前工作于上海某电商服务公司…”); &#x1f4da;System.out.println(“&#x1f388;如果文章中有错误的地方&#xff0c;恳请大家指正&…

连接查询-外连接(FULL JOIN)、内连接(JOIN)、自身连接

一、表与表之间存在着某种联系&#xff0c;如果一个查询必须在多个表之间完成&#xff0c;则需要用到连接查询 二、连接查询的SQL查询语句 格式&#xff1a; SELECT A1&#xff0c;A2&#xff0c;...&#xff0c;Am FROM R1&#xff0c;R2&#xff0c;..&#xff0c;Rn WH…

DevExpress WPF中文教程:Grid - 如何完成列和编辑器配置(设计时)?

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

NSS题目练习9

[极客大挑战 2020]welcome 界面打开后一片空白&#xff0c;查看题目描述&#xff0c;翻译过来是 1.除了GET请求方法&#xff0c;还有一种常见的请求方法… 2.学习一些关于sha1和array的知识。 3.更仔细地检查phpinfo&#xff0c;你会发现标志在哪里。 补充&#xff1a; sh…

什么是端口转发?路由器如何正确的设置端口转发和范围转发?(外网访问必备设置)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 端口转发 📒🚀 端口转发的应用场景💡 路由器如何设置端口转发(示例)💡 端口范围转发(示例)🎯 范围转发的应用场景🛠️ 设置范围转发📝 范围转发实操示例🎈 注意事项 🎈⚓️ 相关链接 ⚓️📖 介绍 📖 …

pyinstaller打包exe多种失败原因解决方法

pyinstaller打包exe多种失败原因解决方法 目录 pyinstaller打包exe多种失败原因解决方法1、pyinstaller安装有问题1.1 安装pyinstaller1.2 采用anconda的环境启动 2、pyqt5与pyside6冲突2.1 打包生成.spec文件2.2 编辑spec文件 3、打包成功后打不开exe&#xff0c;exe闪退3.1 s…