当前位置: 首页 > 编程日记 > 正文

Numpy入门教程:06. 排序,搜索和计数

背景

什么是 NumPy 呢?

NumPy 这个词来源于两个单词 – NumericalPython。其是一个功能强大的 Python 库,可以帮助程序员轻松地进行数值计算,通常应用于以下场景:

  • 执行各种数学任务,如:数值积分、微分、内插、外推等。因此,当涉及到数学任务时,它形成了一种基于 Python 的 MATLAB 的快速替代。
  • 计算机中的图像表示为多维数字数组。NumPy 提供了一些优秀的库函数来快速处理图像。例如,镜像图像、按特定角度旋转图像等。
  • 在编写机器学习算法时,需要对矩阵进行各种数值计算。如:矩阵乘法、求逆、换位、加法等。NumPy 数组用于存储训练数据和机器学习模型的参数。

排序,搜索和计数

排序

  • numpy.sort(a[, axis=-1, kind='quicksort', order=None]) Return a sorted copy of an array.
    • axis:排序沿数组的(轴)方向,0表示按行,1表示按列,None表示展开来排序,默认为-1,表示沿最后的轴排序。
    • kind:排序的算法,提供了快排’quicksort’、混排’mergesort’、堆排’heapsort’, 默认为‘quicksort’。
    • order:排序的字段名,可指定字段排序,默认为None。

【例】

import numpy as npnp.random.seed(20200612)
x = np.random.rand(5, 5) * 10
x = np.around(x, 2)
print(x)
# [[2.32 7.54 9.78 1.73 6.22]
#  [6.93 5.17 9.28 9.76 8.25]
#  [0.01 4.23 0.19 1.73 9.27]
#  [7.99 4.97 0.88 7.32 4.29]
#  [9.05 0.07 8.95 7.9  6.99]]y = np.sort(x)
print(y)
# [[1.73 2.32 6.22 7.54 9.78]
#  [5.17 6.93 8.25 9.28 9.76]
#  [0.01 0.19 1.73 4.23 9.27]
#  [0.88 4.29 4.97 7.32 7.99]
#  [0.07 6.99 7.9  8.95 9.05]]y = np.sort(x, axis=0)
print(y)
# [[0.01 0.07 0.19 1.73 4.29]
#  [2.32 4.23 0.88 1.73 6.22]
#  [6.93 4.97 8.95 7.32 6.99]
#  [7.99 5.17 9.28 7.9  8.25]
#  [9.05 7.54 9.78 9.76 9.27]]y = np.sort(x, axis=1)
print(y)
# [[1.73 2.32 6.22 7.54 9.78]
#  [5.17 6.93 8.25 9.28 9.76]
#  [0.01 0.19 1.73 4.23 9.27]
#  [0.88 4.29 4.97 7.32 7.99]
#  [0.07 6.99 7.9  8.95 9.05]]

【例】

import numpy as npdt = np.dtype([('name', 'S10'), ('age', np.int)])
a = np.array([("Mike", 21), ("Nancy", 25), ("Bob", 17), ("Jane", 27)], dtype=dt)
b = np.sort(a, order='name')
print(b)
# [(b'Bob', 17) (b'Jane', 27) (b'Mike', 21) (b'Nancy', 25)]b = np.sort(a, order='age')
print(b)
# [(b'Bob', 17) (b'Mike', 21) (b'Nancy', 25) (b'Jane', 27)]

如果排序后,想用元素的索引位置替代排序后的实际结果,该怎么办呢?

  • numpy.argsort(a[, axis=-1, kind='quicksort', order=None]) Returns the indices that would sort an array.

【例】对数组沿给定轴执行间接排序,并使用指定排序类型返回数据的索引数组。这个索引数组用于构造排序后的数组。

import numpy as npnp.random.seed(20200612)
x = np.random.randint(0, 10, 10)
print(x)
# [6 1 8 5 5 4 1 2 9 1]y = np.argsort(x)
print(y)
# [1 6 9 7 5 3 4 0 2 8]print(x[y])
# [1 1 1 2 4 5 5 6 8 9]y = np.argsort(-x)
print(y)
# [8 2 0 3 4 5 7 1 6 9]print(x[y])
# [9 8 6 5 5 4 2 1 1 1]

【例】

import numpy as npnp.random.seed(20200612)
x = np.random.rand(5, 5) * 10
x = np.around(x, 2)
print(x)
# [[2.32 7.54 9.78 1.73 6.22]
#  [6.93 5.17 9.28 9.76 8.25]
#  [0.01 4.23 0.19 1.73 9.27]
#  [7.99 4.97 0.88 7.32 4.29]
#  [9.05 0.07 8.95 7.9  6.99]]y = np.argsort(x)
print(y)
# [[3 0 4 1 2]
#  [1 0 4 2 3]
#  [0 2 3 1 4]
#  [2 4 1 3 0]
#  [1 4 3 2 0]]y = np.argsort(x, axis=0)
print(y)
# [[2 4 2 0 3]
#  [0 2 3 2 0]
#  [1 3 4 3 4]
#  [3 1 1 4 1]
#  [4 0 0 1 2]]y = np.argsort(x, axis=1)
print(y)
# [[3 0 4 1 2]
#  [1 0 4 2 3]
#  [0 2 3 1 4]
#  [2 4 1 3 0]
#  [1 4 3 2 0]]y = np.array([np.take(x[i], np.argsort(x[i])) for i in range(5)])
print(y)
# [[1.73 2.32 6.22 7.54 9.78]
#  [5.17 6.93 8.25 9.28 9.76]
#  [0.01 0.19 1.73 4.23 9.27]
#  [0.88 4.29 4.97 7.32 7.99]
#  [0.07 6.99 7.9  8.95 9.05]]

如何将数据按照某一指标进行排序呢?

  • numpy.lexsort(keys[, axis=-1]) Perform an indirect stable sort using a sequence of keys.

【例】按照第一列的升序或者降序对整体数据进行排序。

import numpy as npnp.random.seed(20200612)
x = np.random.rand(5, 5) * 10
x = np.around(x, 2)
print(x)
# [[2.32 7.54 9.78 1.73 6.22]
#  [6.93 5.17 9.28 9.76 8.25]
#  [0.01 4.23 0.19 1.73 9.27]
#  [7.99 4.97 0.88 7.32 4.29]
#  [9.05 0.07 8.95 7.9  6.99]]index = np.lexsort([x[:, 0]])
print(index)
# [2 0 1 3 4]y = x[index]
print(y)
# [[0.01 4.23 0.19 1.73 9.27]
#  [2.32 7.54 9.78 1.73 6.22]
#  [6.93 5.17 9.28 9.76 8.25]
#  [7.99 4.97 0.88 7.32 4.29]
#  [9.05 0.07 8.95 7.9  6.99]]index = np.lexsort([-1 * x[:, 0]])
print(index)
# [4 3 1 0 2]y = x[index]
print(y)
# [[9.05 0.07 8.95 7.9  6.99]
#  [7.99 4.97 0.88 7.32 4.29]
#  [6.93 5.17 9.28 9.76 8.25]
#  [2.32 7.54 9.78 1.73 6.22]
#  [0.01 4.23 0.19 1.73 9.27]]

【例】

import numpy as npx = np.array([1, 5, 1, 4, 3, 4, 4])
y = np.array([9, 4, 0, 4, 0, 2, 1])
a = np.lexsort([x])
b = np.lexsort([y])
print(a)
# [0 2 4 3 5 6 1]
print(x[a])
# [1 1 3 4 4 4 5]print(b)
# [2 4 6 5 1 3 0]
print(y[b])
# [0 0 1 2 4 4 9]z = np.lexsort([y, x])
print(z)
# [2 0 4 6 5 3 1]
print(x[z])
# [1 1 3 4 4 4 5]z = np.lexsort([x, y])
print(z)
# [2 4 6 5 3 1 0]
print(y[z])
# [0 0 1 2 4 4 9]

搜索

  • numpy.argmax(a[, axis=None, out=None])Returns the indices of the maximum values along an axis.

【例】

import numpy as npnp.random.seed(20200612)
x = np.random.rand(5, 5) * 10
x = np.around(x, 2)
print(x)
# [[2.32 7.54 9.78 1.73 6.22]
#  [6.93 5.17 9.28 9.76 8.25]
#  [0.01 4.23 0.19 1.73 9.27]
#  [7.99 4.97 0.88 7.32 4.29]
#  [9.05 0.07 8.95 7.9  6.99]]y = np.argmax(x)
print(y)  # 2y = np.argmax(x, axis=0)
print(y)
# [4 0 0 1 2]y = np.argmax(x, axis=1)
print(y)
# [2 3 4 0 0]
  • numpy.argmin(a[, axis=None, out=None])Returns the indices of the minimum values along an axis.

【例】

import numpy as npnp.random.seed(20200612)
x = np.random.rand(5, 5) * 10
x = np.around(x, 2)
print(x)
# [[2.32 7.54 9.78 1.73 6.22]
#  [6.93 5.17 9.28 9.76 8.25]
#  [0.01 4.23 0.19 1.73 9.27]
#  [7.99 4.97 0.88 7.32 4.29]
#  [9.05 0.07 8.95 7.9  6.99]]y = np.argmin(x)
print(y)  # 10y = np.argmin(x, axis=0)
print(y)
# [2 4 2 0 3]y = np.argmin(x, axis=1)
print(y)
# [3 1 0 2 1]
  • numpy.where(condition, [x=None, y=None]) 函数返回输入数组中满足给定条件的元素的索引。

【例】

import numpy as npx = np.array([1, 2, 3, 4, 5, 6, 7, 8])
y = np.where(x > 5)
print(y)
# (array([5, 6, 7], dtype=int64),)
print(x[y])
# [6 7 8]x = np.array([[11, 12, 13, 14, 15],[16, 17, 18, 19, 20],[21, 22, 23, 24, 25],[26, 27, 28, 29, 30],[31, 32, 33, 34, 35]])
y = np.where(x > 25)
print(y)
# (array([3, 3, 3, 3, 3, 4, 4, 4, 4, 4], dtype=int64), array([0, 1, 2, 3, 4, 0, 1, 2, 3, 4], dtype=int64))print(x[y])
# [26 27 28 29 30 31 32 33 34 35]
  • numpy.searchsorted(a, v[, side='left', sorter=None]) Find indices where elements should be inserted to maintain order.
    • a:一维输入数组。当sorter参数为None的时候,a必须为升序数组;否则,sorter不能为空,存放a中元素的index,用于反映a数组的升序排列方式。
    • v:插入a数组的值,可以为单个元素,list或者ndarray
    • side:查询方向,当为left时,将返回第一个符合条件的元素下标;当为right时,将返回最后一个符合条件的元素下标。
    • sorter:一维数组存放a数组元素的 index,index 对应元素为升序。

【例】

import numpy as npx = np.array([0, 1, 5, 9, 11, 18, 26, 33])
y = np.searchsorted(x, 15)
print(y)  # 5y = np.searchsorted(x, 15, side='right')
print(y)  # 5y = np.searchsorted(x, -1)
print(y)  # 0y = np.searchsorted(x, -1, side='right')
print(y)  # 0y = np.searchsorted(x, 35)
print(y)  # 8y = np.searchsorted(x, 35, side='right')
print(y)  # 8y = np.searchsorted(x, 11)
print(y)  # 4y = np.searchsorted(x, 11, side='right')
print(y)  # 5y = np.searchsorted(x, 0)
print(y)  # 0y = np.searchsorted(x, 0, side='right')
print(y)  # 1y = np.searchsorted(x, 33)
print(y)  # 7y = np.searchsorted(x, 33, side='right')
print(y)  # 8

【例】

import numpy as npx = np.array([0, 1, 5, 9, 11, 18, 26, 33])
y = np.searchsorted(x, [-1, 0, 11, 15, 33, 35])
print(y)  # [0 0 4 5 7 8]y = np.searchsorted(x, [-1, 0, 11, 15, 33, 35], side='right')
print(y)  # [0 1 5 5 8 8]

【例】

import numpy as npx = np.array([0, 1, 5, 9, 11, 18, 26, 33])
np.random.shuffle(x)
print(x)  # [33  1  9 18 11 26  0  5]x_sort = np.argsort(x)
print(x_sort)  # [6 1 7 2 4 3 5 0]y = np.searchsorted(x, [-1, 0, 11, 15, 33, 35], sorter=x_sort)
print(y)  # [0 0 4 5 7 8]y = np.searchsorted(x, [-1, 0, 11, 15, 33, 35], side='right', sorter=x_sort)
print(y)  # [0 1 5 5 8 8]

计数

  • numpy.count_nonzero(a, axis=None) Counts the number of non-zero values in the array a.

【例】返回数组中的非0元素个数。

import numpy as npx = np.count_nonzero(np.eye(4))
print(x)  # 4x = np.count_nonzero([[0, 1, 7, 0, 0], [3, 0, 0, 2, 19]])
print(x)  # 5x = np.count_nonzero([[0, 1, 7, 0, 0], [3, 0, 0, 2, 19]], axis=0)
print(x)  # [1 1 1 1 1]x = np.count_nonzero([[0, 1, 7, 0, 0], [3, 0, 0, 2, 19]], axis=1)
print(x)  # [2 3]

当前活动


我是 终身学习者“老马”,一个长期践行“结伴式学习”理念的 中年大叔

我崇尚分享,渴望成长,于2010年创立了“LSGO软件技术团队”,并加入了国内著名的开源组织“Datawhale”,也是“Dre@mtech”、“智能机器人研究中心”和“大数据与哲学社会科学实验室”的一员。

愿我们一起学习,一起进步,相互陪伴,共同成长。

后台回复「搜搜搜」,随机获取电子资源!
欢迎关注,请扫描二维码:

相关文章:

活动目录在构建核心过程中的八个关键点(下)

活动目录是一个面向Windows Server级别的目录服务。在之前的博客文章中介绍了活动目录设计中需要遵循的七个原则,今天在这里讲解有关《活动目录构建核心关键点》。 全文请见专题:http://os.51cto.com/art/201104/254054.htm 5. LDAP协议简介 LDAP的英文全…

smarty变量调节器--count_words[计算词数]

计算变量里的词数 。 Example 5-7. count_words <?php$smarty->assign(articleTitle, Dealers Will Hear Car Talk at Noon.);?>Where template is:{$articleTitle}{$articleTitle|count_words}This will output:Dealers Will Hear Car Talk at Noon.7 See also cou…

如何开发属于自己的第一个Java程序

学习java技术都是循序渐进的&#xff0c;搭建好了Java开发环境之后&#xff0c;下面就来学习一下如何开发Java程序。为了让初学者更好地完成第一个Java程序&#xff0c;接下来小编通过几个步骤进行逐一讲解。 1.编写Java源文件 在D盘根目录下新建一个test文件夹&#xff0c;并在…

Numpy入门教程:07. 随机抽样

背景 什么是 NumPy 呢&#xff1f; NumPy 这个词来源于两个单词 – Numerical和Python。其是一个功能强大的 Python 库&#xff0c;可以帮助程序员轻松地进行数值计算&#xff0c;通常应用于以下场景&#xff1a; 执行各种数学任务&#xff0c;如&#xff1a;数值积分、微分、…

如何成为一个Android高手

很多Android开发者已经度过了初级、中级&#xff0c;如何成为一个Android高手呢&#xff1f; eoeAndroid就各个级别的程序员应该掌握哪些内容作为下面分类. 一、初级 1. 拥有娴熟的Java基础&#xff0c;理解设计模式&#xff0c;比如OOP语言的工厂模式要懂得. 2. 掌握Android U…

云终端处理器——Atom

由于上周展会的缘故&#xff0c;开始对云终端【I】处理器产生兴趣&#xff0c;接下来在“物理层”【II】来理解下X86-Atom&#xff0c;ARM&#xff0c;MIPS三种处理器&#xff0c;这是第一篇&#xff0c;主Atom Intel公司的官网简单介绍了一句 “英特尔 凌动【III】 处理器&am…

Java培训的学费标准是多少

​ 很多想要进入到互联网行业的小伙伴都会选择java这门编程语言&#xff0c;java编程语言技术在互联网公司是起着非常重要的作用的&#xff0c;那么如今市面上的java培训机构有很多&#xff0c;选择报Java培训的学费标准是多少呢?来看看下面的详细介绍。 ​  Java培训的学费…

Numpy入门教程:08. 集合操作

背景 什么是 NumPy 呢&#xff1f; NumPy 这个词来源于两个单词 – Numerical和Python。其是一个功能强大的 Python 库&#xff0c;可以帮助程序员轻松地进行数值计算&#xff0c;通常应用于以下场景&#xff1a; 执行各种数学任务&#xff0c;如&#xff1a;数值积分、微分、…

iPhone开发技巧之工具篇(4)--- 使用afconvert转换WAV文件

转载自&#xff1a;http://www.yifeiyang.net/iphone-development-skills-of-tool-papers-4-wav-file-conversion-using-afconvert/ 程序中经常使用 .WAV 的音效文件&#xff0c;虽然可以直接使用它&#xff0c;但是最好转换为 apple 推荐的 .CAF 格式。 这个时候我们就可以使用…

SQLite与pandas

以下链接对SQLite使用方法总结的很棒&#xff1a; http://www.cnblogs.com/yuxc/archive/2011/08/18/2143606.html 有关利用pandas读写QSLite的内容&#xff0c;可参考以下链接&#xff1a; http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_sql.html http:…

零基础学习java,这些书一定要看!

学习java技术除了看视频&#xff0c;看书也是非常重要的&#xff0c;尤其是零基础同学&#xff0c;本文包含学习Java各个阶段的书籍推荐&#xff0c;史上最全&#xff0c;学习Java&#xff0c;没有书籍怎么行&#xff0c;就好比出征没带兵器一个道理&#xff0c;这些书籍整理出…

Numpy入门教程:练习作业01

序言 什么是 NumPy 呢&#xff1f; NumPy 这个词来源于两个单词 – Numerical和Python。其是一个功能强大的 Python 库&#xff0c;可以帮助程序员轻松地进行数值计算&#xff0c;通常应用于以下场景&#xff1a; 执行各种数学任务&#xff0c;如&#xff1a;数值积分、微分、…

转乱码UTF8和UTF-8网页编码

http://www.lovelucy.info/utf8-vs-utf-8.html#more-794 一、遇到的问题 曾经被字符集间复杂的转换搞怕了&#xff0c;正好新项目要求国际化&#xff0c;需要能够显示多种语言&#xff0c;于是一开始就规定统统使用 UTF-8 编码。 所有代码文件使用 UTF-8 编码存盘MySQL数据库所…

linux管道的执行顺序

最近有个疑问&#xff0c;netstat -antup|head -500 类似这条命令中&#xff0c;是netstat 执行完然后截取前500条记录还是&#xff0c;netstat 与head 并行执行&#xff0c;netstat 执行完500条就不再继续&#xff1f; 最终答案由酷学园darkdanger大大提供&#xff1a; 唔…

为什么学习Python数据分析

为什么学习Python数据分析?这是很多人都比较关注的一个问题&#xff0c;Python编程语言近几年在互联网行业是非常火爆的&#xff0c;尤其是在人工智能这一领域&#xff0c;它会大大的提高我们的工作效率等等&#xff0c;具体来看看下面的详细介绍就知道了。 为什么学习Python数…

Python自动化开发学习6

引子 假设我们要在我们的程序里表示狗&#xff0c;狗有如下属性&#xff1a;名字、品种、颜色。那么可以先定义一个模板&#xff0c;然后调用这个模板生成各种狗。 def dog(name,d_type,color):data {name:name,d_type:d_type,color:color}return data d1 dog(小七,拉布拉多,…

Numpy入门教程:09. 输入和输出

背景 什么是 NumPy 呢&#xff1f; NumPy 这个词来源于两个单词 – Numerical和Python。其是一个功能强大的 Python 库&#xff0c;可以帮助程序员轻松地进行数值计算&#xff0c;通常应用于以下场景&#xff1a; 执行各种数学任务&#xff0c;如&#xff1a;数值积分、微分、…

第二语言综合征

前些天在看一本书&#xff0c;温伯格的《理解专业程序员》&#xff0c;其中提到有的程序员得了第二语言综合征——在学习第三、第四门语言的时候很容易&#xff0c;但是学习第二门简直能要了他们的命。我当时就确定我患了这个毛病&#xff0c;因为我一直想了解Java语言&#xf…

Python文件操作:finally子句的使用

finally子句与try-except语句连用时&#xff0c;无论try-except是否捕获到异常&#xff0c;finally子句后的代码都要执行&#xff0c;其语法格式如下&#xff1a; try: 可能出错的语句 ......except: 出错后的执行语句finally: 无论是否出错都会执行的语句 Python在处理文件时&…

Numpy入门教程:练习作业02

背景 什么是 NumPy 呢&#xff1f; NumPy 这个词来源于两个单词 – Numerical和Python。其是一个功能强大的 Python 库&#xff0c;可以帮助程序员轻松地进行数值计算&#xff0c;通常应用于以下场景&#xff1a; 执行各种数学任务&#xff0c;如&#xff1a;数值积分、微分、…

PowerShell 导入 SQL Server 的 PS 模块

接触过UNIX或者Linux 的朋友都知道此类系统有着功能强大、无所不能的壳程序,称之为Shell。微软公司于2006年第四季度正式发布PowerShell&#xff0c;它的出现标志着, 微软公司向服务器领域迈出了重要的一步, 不仅提供简便的图形化操作界面&#xff0c;同时提供类似于Unix, Linu…

ARM嵌入式操作系统启动

任何一个操作系统的启动都至少关注两个方面&#xff1a;&#xff11;&#xff0c;程序运行栈的初始化。&#xff12;&#xff0c;处理器外设的初始化。 在&#xff21;&#xff32;&#xff2d;&#xff56;&#xff16;以及以前的体系结构中&#xff0c;定义了七种模式分别为&…

Html5 aside标签的用法和作用

aside元素用来定义当前页面或者文章的附属信息部分&#xff0c;它可以包含与当前页面或主要内容相关的引用、侧边栏、广告、导航条等其他类似的有别于主要内容的部分。 aside元素的用法主要分为两种。 ● 被包含在article元素内作为主要内容的附属信息。 ● 在article元素之外使…

Numpy入门教程:10. 统计相关

背景 什么是 NumPy 呢&#xff1f; NumPy 这个词来源于两个单词 – Numerical和Python。其是一个功能强大的 Python 库&#xff0c;可以帮助程序员轻松地进行数值计算&#xff0c;通常应用于以下场景&#xff1a; 执行各种数学任务&#xff0c;如&#xff1a;数值积分、微分、…

Windows 7+Code::Blocks+wxWidgets实录(一)

环境配置篇 玩过Linux的人应该对Code::Blocks和wxWidgets并不陌生。 Code::Blocks是一款非常有名的代码编辑器&#xff0c;在linux下用不惯vim的话&#xff0c;这是个不错的选择。但千万不要把它和编译器混淆&#xff0c;CB本身并没有独立编译程序的功能&#xff0c;需要调用系…

技巧:两部解决U盘安装windows 7

第一步&#xff1a;准备一个4G的U盘并使用disk part 工具制作成引导盘1、在运行中输入cmd 回车2、在黑色的命令提示符界面中输入Diskpart3、插入U盘 并输入List Disk查看4、输入Select Disk 1 &#xff08;选择你的U盘所在的标识&#xff09;5、输入clean 清除旧的信息6、输入c…

报Java面授班有哪些优势

​ java技术在互联网行业的高速发展&#xff0c;让很多人都开始学习java技术&#xff0c;大家都想知道学习java技术面授班好还是网络班好&#xff0c;小编觉得当然是面授班比较好&#xff0c;下面小编就带大家来详细的了解一下报Java面授班有哪些优势? ​  报Java面授班有哪…

刻意练习:Python基础 -- Task13. datetime模块详解

datetime模块 datetime 是 Python 中处理日期的标准模块&#xff0c;它提供了 4 种对日期和时间进行处理的类&#xff1a;datetime、date、time 和 timedelta。 datetime类 class datetime(date):def __init__(self, year, month, day, hour, minute, second, microsecond, t…

关于java和c的选择结构和循环结构

java和c在这些结构上确实没区别。 另学会一个小技巧&#xff0c;在编辑界面选中段落之后按tab可以整体后移选中的段落&#xff0c;再按shifttab可以将选中的段落前移。转载于:https://www.cnblogs.com/hloli/archive/2012/03/15/2398675.html

从控制器到驱动器的WD——硬盘巨头启示录之西数篇

WD&#xff08;Western Digital&#xff0c;西部数据&#xff09;公司创立的时间比希捷公司还早近10年&#xff0c;但作为硬盘驱动器供应商的历史可不算长。1970年4月23日&#xff0c;一家名为General Digital&#xff08;通用数字&#xff09;的公司诞生了&#xff0c;其最初是…