NumPy(Python库):数组的排序与搜索技术教程
off999 2024-10-04 18:49 33 浏览 0 评论
NumPy简介
1. NumPy库的安装与导入
在Python环境中,安装NumPy库可以通过pip命令轻松完成。如果你的系统中尚未安装NumPy,可以打开命令行界面,然后输入以下命令:
pip install numpy
一旦安装完成,你可以在Python脚本中通过以下语句导入NumPy库:
import numpy as np
这里我们通常将NumPy导入为np,这是一个约定俗成的简写,便于后续代码中使用。
2. NumPy数组的基本操作
NumPy的核心是ndarray对象,这是一个多维数组对象,非常适合进行数值计算。下面我们将通过一些基本操作来熟悉NumPy数组。
2.1 创建数组
创建NumPy数组最简单的方法是使用numpy.array()函数。例如,我们可以创建一个一维数组:
import numpy as np
# 创建一个一维数组
arr = np.array([1, 2, 3, 4, 5])
print(arr)
输出:
array([1, 2, 3, 4, 5])
我们也可以创建一个二维数组:
# 创建一个二维数组
arr_2d = np.array([[1, 2, 3], [4, 5, 6]])
print(arr_2d)
输出:
array([[1, 2, 3],
[4, 5, 6]])
2.2 数组的索引和切片
NumPy数组支持索引和切片操作,这使得我们可以轻松地访问和操作数组中的元素。例如,我们可以从一维数组中获取特定元素:
# 获取第一个元素
print(arr[0])
输出:
1
对于二维数组,我们可以使用两个索引来访问元素:
# 获取第一个子数组的第二个元素
print(arr_2d[0, 1])
输出:
2
切片操作允许我们获取数组的一部分:
# 获取数组的前三个元素
print(arr[:3])
输出:
array([1, 2, 3])
对于二维数组,我们可以使用切片来获取子数组:
# 获取第二个子数组
print(arr_2d[1, :])
输出:
array([4, 5, 6])
2.3 数组的形状和重塑
NumPy数组的形状可以通过shape属性获取,这将返回一个表示数组维度的元组。例如:
# 获取数组的形状
print(arr.shape)
print(arr_2d.shape)
输出:
(5,)
(2, 3)
我们还可以使用reshape方法来改变数组的形状,只要新的形状与原数组的元素数量相匹配:
# 将一维数组重塑为二维数组
arr_reshaped = arr.reshape((5, 1))
print(arr_reshaped)
输出:
array([[1],
[2],
[3],
[4],
[5]])
2.4 数组的数学操作
NumPy数组支持各种数学操作,包括加、减、乘、除等。这些操作可以应用于整个数组,也可以应用于数组的元素级操作。例如:
# 创建两个一维数组
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
# 元素级相加
print(arr1 + arr2)
输出:
array([5, 7, 9])
我们还可以使用NumPy的内置函数进行更复杂的数学操作,如求和、平均值、最大值和最小值:
# 求和
print(np.sum(arr1))
# 平均值
print(np.mean(arr1))
# 最大值
print(np.max(arr1))
# 最小值
print(np.min(arr1))
输出:
6
2.0
3
1
2.5 数组的广播机制
NumPy的广播机制允许我们对形状不完全匹配的数组进行操作。例如,我们可以将一个标量值加到一个数组上:
# 创建一个一维数组
arr = np.array([1, 2, 3])
# 将标量值加到数组上
print(arr + 5)
输出:
array([6, 7, 8])
我们也可以将一个一维数组与一个二维数组进行操作:
# 创建一个一维数组和一个二维数组
arr1 = np.array([1, 2, 3])
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
# 将一维数组加到二维数组上
print(arr2 + arr1)
输出:
array([[2, 4, 6],
[5, 7, 9]])
2.6 数组的拼接和分割
NumPy提供了concatenate和split函数来拼接和分割数组。例如,我们可以使用concatenate函数将两个数组拼接在一起:
# 创建两个一维数组
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
# 拼接数组
arr_concatenated = np.concatenate((arr1, arr2))
print(arr_concatenated)
输出:
array([1, 2, 3, 4, 5, 6])
我们也可以使用split函数将一个数组分割成多个数组:
# 创建一个一维数组
arr = np.array([1, 2, 3, 4, 5, 6])
# 将数组分割成两个
arr_split = np.split(arr, 2)
print(arr_split)
输出:
[array([1, 2, 3]), array([4, 5, 6])]
2.7 数组的条件操作
NumPy数组支持条件操作,这使得我们可以基于条件来操作数组。例如,我们可以使用where函数来根据条件选择数组中的元素:
# 创建一个一维数组
arr = np.array([1, 2, 3, 4, 5])
# 使用where函数选择大于2的元素
arr_filtered = np.where(arr > 2, arr, 0)
print(arr_filtered)
输出:
array([0, 0, 3, 4, 5])
这里np.where函数的语法是np.where(condition, x, y),如果condition为真,则返回x,否则返回y。
2.8 数组的类型转换
NumPy数组可以转换为其他类型,如Python列表,也可以将其他类型转换为NumPy数组。例如:
# 将NumPy数组转换为Python列表
arr_list = arr.tolist()
print(arr_list)
# 将Python列表转换为NumPy数组
list_to_arr = np.array([1, 2, 3])
print(list_to_arr)
输出:
[1, 2, 3, 4, 5]
array([1, 2, 3])
2.9 数组的随机数生成
NumPy提供了生成随机数的函数,这对于模拟和数据分析非常有用。例如,我们可以使用random.rand函数生成一个随机数组:
# 生成一个形状为(3, 3)的随机数组
random_arr = np.random.rand(3, 3)
print(random_arr)
输出将是一个3x3的数组,其中的元素是0到1之间的随机数。
2.10 数组的统计函数
NumPy提供了许多统计函数,如mean、median、std等,用于计算数组的统计量。例如:
# 创建一个一维数组
arr = np.array([1, 2, 3, 4, 5])
# 计算平均值
print(np.mean(arr))
# 计算中位数
print(np.median(arr))
# 计算标准差
print(np.std(arr))
输出:
3.0
3.0
1.4142135623730951
这些基本操作只是NumPy功能的冰山一角,但它们足以让你开始使用NumPy进行数值计算和数据分析。随着你对NumPy的深入学习,你将能够利用其更高级的功能,如线性代数、傅立叶变换等。
NumPy(Python库):数组的排序
3. 使用numpy.sort()进行排序
在NumPy中,numpy.sort()函数是一个强大的工具,用于对数组中的元素进行排序。它不仅可以对一维数组进行排序,还可以处理多维数组,甚至可以对数组中的复杂数据类型进行排序。
3.1 一维数组排序
import numpy as np
# 创建一个一维数组
arr = np.array([3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5])
# 使用numpy.sort()进行排序
sorted_arr = np.sort(arr)
print(sorted_arr)
这段代码创建了一个一维数组arr,然后使用numpy.sort()函数对其进行排序。排序后的数组sorted_arr将按升序排列。
3.2 多维数组排序
对于多维数组,numpy.sort()可以沿特定轴进行排序。
# 创建一个二维数组
arr_2d = np.array([[8, 4, 6], [1, 2, 10], [3, 7, 9]])
# 沿第一轴(垂直)排序
sorted_arr_2d_axis0 = np.sort(arr_2d, axis=0)
# 沿第二轴(水平)排序
sorted_arr_2d_axis1 = np.sort(arr_2d, axis=1)
print("沿第一轴排序:\n", sorted_arr_2d_axis0)
print("沿第二轴排序:\n", sorted_arr_2d_axis1)
在这个例子中,arr_2d是一个二维数组。np.sort(arr_2d, axis=0)将沿垂直轴排序,而np.sort(arr_2d, axis=1)将沿水平轴排序。
3.3 复杂数据类型排序
NumPy还可以对包含结构化数据类型的数组进行排序。
# 创建一个结构化数组
dt = np.dtype([('name', 'S10'), ('age', int)])
arr_struct = np.array([('Tom', 21), ('Jerry', 25), ('Spike', 20)], dtype=dt)
# 按'age'字段排序
sorted_arr_struct = np.sort(arr_struct, order='age')
print(sorted_arr_struct)
这里,arr_struct是一个结构化数组,包含姓名和年龄两个字段。通过np.sort(arr_struct, order='age'),我们可以按年龄字段对数组进行排序。
4. 排序算法的性能分析
NumPy的sort()函数使用了快速排序、堆排序或归并排序算法,具体取决于数组的大小和数据类型。对于大多数情况,NumPy的排序算法是高效的,但在处理非常大的数组时,性能分析变得尤为重要。
4.1 性能测试
import time
# 创建一个大数组
large_arr = np.random.randint(0, 1000000, size=1000000)
# 测试排序时间
start_time = time.time()
sorted_large_arr = np.sort(large_arr)
end_time = time.time()
print("排序时间:", end_time - start_time)
通过记录排序前后的系统时间,我们可以测量排序一个大数组所需的时间,从而分析numpy.sort()的性能。
5. 高级排序选项
NumPy的sort()函数提供了多种高级选项,如kind参数,用于指定排序算法;order参数,用于结构化数组的排序。
5.1 指定排序算法
# 使用堆排序
sorted_arr_heap = np.sort(arr, kind='heapsort')
# 使用归并排序
sorted_arr_merge = np.sort(arr, kind='mergesort')
# 使用快速排序
sorted_arr_quick = np.sort(arr, kind='quicksort')
kind参数允许我们选择不同的排序算法。堆排序、归并排序和快速排序各有优缺点,选择合适的算法可以优化特定情况下的性能。
5.2 结构化数组的排序
在结构化数组中,我们可以指定按哪个字段进行排序。
# 按'name'字段排序
sorted_arr_struct_name = np.sort(arr_struct, order='name')
print(sorted_arr_struct_name)
通过order参数,我们可以指定按结构化数组中的哪个字段进行排序,这在处理复杂数据时非常有用。
以上就是使用NumPy进行数组排序的详细教程,包括一维和多维数组的排序,以及结构化数组的排序方法。通过理解和应用这些高级选项,你可以更有效地处理和分析数据。
数组搜索
6. 使用numpy.searchsorted()进行搜索
numpy.searchsorted()函数是NumPy库中用于在排序数组中查找元素插入位置的工具。这在处理大量数据时特别有用,因为它可以高效地确定新元素应该插入的位置,以保持数组的排序状态。
6.1 原理
numpy.searchsorted()函数通过二分查找算法来确定插入位置。二分查找是一种在有序列表中查找特定元素的算法,其效率远高于线性查找。该函数返回一个数组,其中包含每个元素在目标数组中应该插入的索引,以保持数组的排序。
6.2 代码示例
import numpy as np
# 创建一个排序的数组
sorted_array = np.array([1, 3, 4, 5, 7, 9, 11])
# 要插入的元素
elements = np.array([2, 6, 10])
# 使用searchsorted()函数找到插入位置
insert_positions = np.searchsorted(sorted_array, elements)
# 输出结果
print("插入位置:", insert_positions)
6.3 解释
在上述代码中,我们首先创建了一个排序的数组sorted_array。然后,我们定义了一个elements数组,其中包含我们想要插入的新元素。通过调用np.searchsorted(sorted_array, elements),我们得到了一个数组insert_positions,它表示elements中的每个元素应该插入sorted_array中的位置。在这个例子中,输出应该是[1, 4, 6],这意味着2应该插入在索引1的位置,6应该插入在索引4的位置,而10应该插入在索引6的位置。
7. 数组中的元素查找技巧
在NumPy中,除了searchsorted(),还有其他方法可以用于在数组中查找元素,特别是当数组未排序时。
7.1 使用np.where()
np.where()函数可以用于查找数组中满足特定条件的元素的索引。这在需要基于条件查找元素时非常有用。
7.2 代码示例
import numpy as np
# 创建一个未排序的数组
array = np.array([10, 2, 5, 6, 9, 1, 11])
# 查找值为5的元素的索引
index_of_five = np.where(array == 5)
# 输出结果
print("值为5的元素的索引:", index_of_five)
7.3 解释
在这个例子中,我们使用np.where(array == 5)来查找数组中值为5的元素的索引。np.where()函数返回一个元组,其中包含满足条件的元素的索引。输出应该是(array([2]),), 这意味着值为5的元素位于索引2的位置。
8. 搜索排序数组的优化方法
当处理非常大的排序数组时,直接使用searchsorted()可能不是最高效的。可以结合NumPy的其他功能,如np.bincount()和np.cumsum(),来优化搜索过程。
8.1 使用np.bincount()和np.cumsum()
np.bincount()可以用于计算数组中每个值的出现次数,而np.cumsum()则可以计算这些计数的累积和。结合使用这两个函数,可以快速确定一个值在数组中的位置范围,从而加速搜索过程。
8.2 代码示例
import numpy as np
# 创建一个排序的数组,包含重复元素
sorted_array = np.array([1, 1, 2, 2, 2, 3, 4, 4, 4, 4])
# 计算每个值的出现次数
counts = np.bincount(sorted_array)
# 计算累积和
cumulative_sums = np.cumsum(counts)
# 查找值为2的元素的起始和结束位置
start_index = cumulative_sums[1] # 1是2的前一个值
end_index = cumulative_sums[2] # 2的累积计数
# 输出结果
print("值为2的元素的起始位置:", start_index)
print("值为2的元素的结束位置:", end_index)
8.3 解释
在这个例子中,我们首先使用np.bincount(sorted_array)来计算sorted_array中每个值的出现次数。然后,我们使用np.cumsum(counts)来计算这些计数的累积和。通过查找累积和中值为2的元素的前一个值和当前值的累积计数,我们可以确定值为2的元素在数组中的起始和结束位置。在这个例子中,输出应该是起始位置为2,结束位置为5,这意味着值为2的元素位于索引2到4的位置。
通过这些方法,我们可以有效地在NumPy数组中进行搜索和元素查找,无论是对于排序还是未排序的数组,都能找到合适的解决方案。
NumPy(Python库):数组的排序与搜索 - 综合应用实例
9. 排序与搜索在数据分析中的应用
在数据分析领域,排序和搜索是处理数据集时的常见操作。NumPy库提供了高效的方法来对数组进行排序和搜索,这对于处理大型数据集尤其重要。下面,我们将通过具体的代码示例来展示如何使用NumPy进行排序和搜索。
9.1 排序
NumPy的np.sort函数可以对数组进行排序。它支持多种排序算法,包括快速排序、堆排序和稳定的排序算法。此外,np.sort可以对多维数组进行排序,这在处理复杂数据结构时非常有用。
示例:对一维数组进行排序
import numpy as np
# 创建一个随机的一维数组
data = np.random.randint(0, 100, size=10)
print("原始数组:", data)
# 使用np.sort进行排序
sorted_data = np.sort(data)
print("排序后的数组:", sorted_data)
示例:对二维数组按列排序
# 创建一个随机的二维数组
data_2d = np.random.randint(0, 100, size=(10, 3))
print("原始二维数组:\n", data_2d)
# 按第一列排序
sorted_data_2d = data_2d[data_2d[:,0].argsort()]
print("按第一列排序后的二维数组:\n", sorted_data_2d)
9.2 搜索
NumPy的np.searchsorted函数可以找到一个值在已排序数组中的插入位置,而np.where函数则可以找到数组中满足特定条件的元素的索引。
示例:使用np.searchsorted
# 已排序的数组
sorted_data = np.array([1, 3, 5, 7, 9])
# 查找值5的插入位置
index = np.searchsorted(sorted_data, 5)
print("值5的插入位置:", index)
# 查找值6的插入位置
index = np.searchsorted(sorted_data, 6)
print("值6的插入位置:", index)
示例:使用np.where
# 查找大于50的元素的索引
indices = np.where(data > 50)
print("大于50的元素的索引:", indices)
10. 实战案例:处理大型数据集
当处理大型数据集时,NumPy的排序和搜索功能可以显著提高数据处理的效率。下面,我们将通过一个实战案例来展示如何使用NumPy对大型数据集进行排序和搜索。
10.1 创建大型数据集
# 创建一个10000x3的大型随机数组
large_data = np.random.randint(0, 100000, size=(10000, 3))
print("大型数据集的前几行:\n", large_data[:5])
10.2 对大型数据集进行排序
# 按第一列对大型数据集进行排序
sorted_large_data = large_data[large_data[:,0].argsort()]
print("按第一列排序后的大型数据集的前几行:\n", sorted_large_data[:5])
10.3 在大型数据集中搜索
# 查找特定值的插入位置
value = 50000
index = np.searchsorted(sorted_large_data[:,0], value)
print("值", value, "的插入位置:", index)
# 查找满足条件的元素的索引
condition = sorted_large_data[:,0] > 50000
indices = np.where(condition)
print("满足条件的元素的索引:", indices)
通过这些示例,我们可以看到NumPy的排序和搜索功能在处理大型数据集时的高效性和灵活性。这些功能不仅简化了代码,还提高了数据处理的速度,是数据分析中不可或缺的工具。
相关推荐
- android13正式版下载(安卓版本13)
-
出现该问题的原因是,用户在设置里开启了新下载的APP,仅添加到APP资源库选项。大家只要进入“设置-主屏幕”,把新下载的APP,改为“添加到主屏幕”即可解决问题。修改完成后,你再进入AppStore下...
- firefox浏览器安卓版(firefox浏览器安卓版 打开本地网页)
-
要进入火狐浏览器手机版的主页,你可以通过以下几种方式进行:首先,打开火狐浏览器App,然后点击右上角的三条横线菜单按钮,接着选择“主页”选项。另外,你也可以直接在浏览器地址栏中输入“about:hom...
- 电脑cpu性能排行榜天梯图(“电脑cpu性能天梯图”)
-
一、英特尔酷睿i7670。这款英特尔CPU采用的是超频新芯,最大程度的提升处理器的超频能力。二、英特尔酷睿i74790kCPU:这款CPU采用22纳米制程工艺的框架,它的默认频率是4.0到4.4Ghz...
- 电脑自由截屏的快捷键是什么
-
快捷键是ctrl+alt+a,我们可将聊天窗口缩小,放在旁边。然后找到想要截屏的位置,这时我们在截屏旁边,就更加的方便了。在键盘中按下PrintScreenSysRq(简写为PrtSc)键,此快捷...
- windows10精简版官网下载(win10官方精简版下载)
-
精简版的意思的它比原版的功能和软件少了,其实精简版的更适合大众,没有多余的其他必要功能,更快Win10版本主要为四个分别是专业版、家庭版、企业版、教育版,其实除了这四个之外,还有工作站版、LTSB/L...
- cad2008安装失败(Win11安装cad2008安装失败)
-
解决方法:1、右键点击“开始”按钮,选择“程序和功能”;2、然后点击“启用或关闭windows功能”;3、勾选“Microsoft.NETFramework3.5(包括.Net2.0)”后点击确定按钮...
- u盘在电脑上怎么找出来(u盘在电脑上怎么找到)
-
在电脑中找不到u盘,是因为系统没有自动识别出来,手动打开即可,具体的解决步骤如下:1、在桌面上点击我的电脑,右键,管理。2、打开管理界面,点击储存。3、进到储存页面。4、到这一步,也就可以看到了,有这...
- 联想一体机怎么进入bios(联想一体机怎么进入u盘启动)
-
所需工具:联想Lenovo品牌一体机、启动U盘。具体步骤如下:1、联想一体机从U盘启动设置步骤如下重启联想一体机,启动过程中按F1进入BIOS,部分机型则是开机按Enter键,进入之后再按F12选择进...
- 如何装ghost系统盘(ghost装机教程)
-
ghost是不能做系统c盘,它是一种对硬盘和分区制作成映像文件进行备份和恢复的工具软件,是不能进行操作系统安装。这个软件的使用目的是,当我们安装配置好操作系统以后,用ghost软件对c盘进行备份,或者...
- 加密u盘如何格式化(加密u盘如何格式化手机)
-
1,点击系统与安全进入电脑的控制面板界面,点击上方的系统与安全的选项,在系统界面找到最下方的管理工具功能组。2,选中u盘选择管理工具下面的创建并格式化硬盘分区,点击弹出磁盘管理的界面,在这个里面选中你...
- 万能显卡驱动离线版pc(万能显卡驱动离线版)
-
万用驱动是综合各电脑硬件的性能而制做的软件,对于大多数的电脑硬件驱动都好用,但对于少数品牌电脑驱动要求严格的,就不灵了。有的硬件用万能驱动后,使用效果不佳,就是因为没有完全驱动好。所以,知名品牌电脑硬...
- 笔记本windows8系统下载(笔记本电脑系统win8)
-
在电脑上面就可以下载,打开浏览器搜索windous8系统会出现一些下拉选择,选择第一条或者选择有官网字样的,就直接有下载按钮,然后点击下载就可以了win8可以支持现在可以见到的所有Photosho...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
慕ke 前端工程师2024「完整」
-
失业程序员复习python笔记——条件与循环
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
