NumPy学习第十四课:数组条件筛选、排序函数的使用

86 阅读7分钟

前言导读

在前面的学习当中,我们在输出数组的时候,基本上就是原数组是什么形状,输出也就是什么形状的了,就像我们调用输出数组最大值最小值函数的时候,如果数据量非常庞大的话,而且不是规整的排序,那么我们输出数据的时候没有办法进行校验输出的是否正确。那么数组有没有筛选、排序这样的函数呢?

那是当然得了,NumPy库已经帮我们封装好了相关的排序、条件筛选函数了,我们只需要去学习如何进行调用就可以了,非常的方便。

本节我们就开始学习排序和条件筛选数组函数的操作。

排序算法

NumPy库类似一个数学宝典,将很多功能都进行了封装,而且提供了很多种的排序算法。每个排序算法不一样,往往也导致了排序的速度和性能有很大的区别,速度和性能的影响也会导致所占用的计算空间呀这些都会发生不同的变化,所以我们在选择哪种排序时,是根据当前项目环境进行的,比一定最优的就是最好的。

这里我们先看NumPy给我们提供的三种排序算法的比较:

排序种类速度最坏情况工作空间稳定性
'quicksort'(快速排序)1O(n^2)0不稳定
'mergesort'(归并排序)2O(n*log(n))~n/2稳定
'heapsort'(堆排序)3O(n*log(n))0不稳定

函数的使用

1、sort()函数

使用功能: 返回原数组从小到大排序的副本

函数格式: numpy.sort(a, axis, kind, order)

参数说明: a:原数组;axis:进行数组操作的轴;kind:排序算法,默认是‘quicksort’;order:排序字段,数组进行结构化。

实例代码:

# -*- coding: utf-8 -*-
"""
@Created on : 2024/5/20 10:49
@creator : er_nao
@File :numpy_27_排序条件筛选函数.py
@Description :
"""
import numpy as np

x = np.array([[8, 6], [4, 7]])
print('原数组')
print(x)
print('\n')

# 1.调用sort()函数
print('sort()函数返回排序副本,无axis')
print(np.sort(x))
print('\n')
print('sort()函数返回排序副本,axis=1')
print(np.sort(x, axis=1))
print('\n')
print('使用order排序字段')
dt = np.dtype([('name', 'S10'), ('age', int), ('height', float)])
p = np.array([('lili', 20, 92.5), ('yeoman', 34, 165.0), ('sushi', 56, 140.5)], dtype=dt)
print('按name排序')
print(np.sort(p, order='name'))
print('\n')
print('按age排序')
print(np.sort(p, order='age'))
print('\n')
print('按height排序')
print(np.sort(p, order='height'))

# 输出结果:
# 原数组
# [[8 6]
#  [4 7]]
#
#
# sort()函数返回排序副本,无axis
# [[6 8]
#  [4 7]]
#
#
# sort()函数返回排序副本,axis=1
# [[6 8]
#  [4 7]]
#
#
# 使用order排序字段
# 按name排序
# [(b'lili', 20,  92.5) (b'sushi', 56, 140.5) (b'yeoman', 34, 165. )]
#
#
# 按age排序
# [(b'lili', 20,  92.5) (b'yeoman', 34, 165. ) (b'sushi', 56, 140.5)]
#
#
# 按height排序
# [(b'lili', 20,  92.5) (b'sushi', 56, 140.5) (b'yeoman', 34, 165. )]

2、argsort()函数

使用功能: 返回原数组从小到大排序的索引值

函数格式: numpy.argsort(a, axis, kind, order)

参数说明: a:原数组;axis:进行数组操作的轴;kind:排序算法,默认是‘quicksort’;order:排序字段,数组进行结构化。

实例代码:

dt = np.dtype([('name', 'S10'), ('age', int), ('height', float)])
p = np.array([('lili', 20, 92.5), ('yeoman', 34, 165.0), ('sushi', 56, 140.5)], dtype=dt)

# 2.调用argsort()函数
print('\n')
print('按height排序,并返回索引值')
print(np.argsort(p, order='height'))
print('\n')
print('按age排序,并返回索引值')
print(np.argsort(p, order='age'))

# 输出结果
# 按height排序,并返回索引值
# [0 2 1]
# 
# 
# 按age排序,并返回索引值
# [0 1 2]

3、lexsort()函数

使用功能: 返回多重数组从小到大排序的索引值

函数格式: numpy.lexsort(keys, axis=None)

参数说明: keys:排序的原数组名称(这里可以同时对多个数组进行排序);axis:进行数组操作的轴。

实例代码:

# 3.lexsort() 函数
print('调用lexsort() 函数')
a1 = ('lili', 'yeye', 'yaoyao', 'binbin')
a2 = ('8', '3', '9', '2')

# 先给a2排序,再给a1进行排序。
ind = np.lexsort((a2, a1))  
print(ind)
print('\n')
print('排序后的值')
print([a2[i] +" " + a1[i] for i in ind])


# 输出结果
# 调用lexsort() 函数
# [3 0 2 1]
# 
# 
# 排序后的值
# ['2 binbin', '8 lili', '9 yaoyao', '3 yeye']

4、argmax()函数

使用功能: 沿给定轴返回最大元素的索引值

函数格式: numpy.argmax(a, axis=None, out=None, *, keepdims=np._NoValue)

参数说明: a:原数组;axis:进行数组操作的轴;out:输出到指定数组当中;keepdims:bool类型,可选 如果将其设置为True,则会保留减少的轴。

实例代码:

# 4.argmax()函数
s = np.array([[20, 25, 30], [70, 50, 63], [70, 89, 90]])
print('原数组')
print(s)
print('\n')
print('调用 argmax() 函数:')
print(np.argmax(s))
print('\n')
print('axis =1的最大索引')
print(np.argmax(s, axis=1))
print('\n')
print('axis =0的最大索引')
print(np.argmax(s, axis=0))

# 输出结果
# 原数组
# [[20 25 30]
#  [70 50 63]
#  [70 89 90]]
# 
# 
# 调用 argmax() 函数:
# 8
# 
# 
# axis =1的最大索引
# [2 0 2]
# 
# 
# axis =0的最大索引
# [1 2 2]

5、argmin()函数

使用功能: 沿给定轴返回最小元素的索引值

函数格式: numpy.argmin(a, axis=None, out=None, *, keepdims=np._NoValue)

参数说明: a:原数组;axis:进行数组操作的轴;out:输出到指定数组当中;keepdims:bool类型,可选 如果将其设置为True,则会保留减少的轴。

实例代码:

s = np.array([[20, 25, 30], [70, 50, 63], [70, 89, 90]])
print('原数组')
print(s)
print('\n')
print('调用 argmin() 函数:')
print(np.argmin(s))
print('\n')
print('axis =1的最小索引')
print(np.argmin(s, axis=1))
print('\n')
print('axis =0的最小索引')
print(np.argmin(s, axis=0))

# 输出结果
# 原数组
# [[20 25 30]
#  [70 50 63]
#  [70 89 90]]
# 
# 
# 调用 argmin() 函数:
# 0
# 
# 
# axis =1的最小索引
# [0 1 0]
# 
# 
# axis =0的最小索引
# [0 0 0]

6、nonzero()函数

使用功能: 返回输入数组中非零元素的索引值。

函数格式: numpy.nonzero(a)

参数说明: a:原数组。

实例代码:

# 5.nonzero函数
s1 = np.array([[0, 25, 30], [70, 0, 63], [70, 89, 0]])
print('原数组')
print(s1)
print('\n')
print('调用nonzero()函数后返回索引值:')
print(np.nonzero(s1))
# 输出结果
# 原数组
# [[ 0 25 30]
#  [70  0 63]
#  [70 89  0]]
#
#
# 调用nonzero()函数后返回索引值:
# (array([0, 0, 1, 1, 2, 2], dtype=int64), array([1, 2, 0, 2, 0, 1], dtype=int64))

7、where()函数

使用功能: 输入数组中满足where条件的元素的索引。

函数格式: numpy.where(condition,[x, y])

参数说明: condition:给定的筛选条件;[x, y]选择的值,遵循广播规则。

实例代码:

# 6.where函数
s2 = np.array([[0, 25, 30], [70, 0, 63], [70, 89, 0]])
print('原数组')
print(s2)
print('\n')
print('调用where函数后返回索引值:')
print(np.where(s2 > 30))

# 输出结果
# 原数组
# [[ 0 25 30]
#  [70  0 63]
#  [70 89  0]]
# 
# 
# 调用where函数后返回索引值:
# (array([1, 1, 2, 2], dtype=int64), array([0, 2, 0, 1], dtype=int64))

8、extract()函数

使用功能: 使用特定的条件,抽取数组中的元素。

函数格式: numpy.extract(condition, arr)

参数说明: condition:给定的筛选条件;arr要抽取的原数组。

实例代码:

s3 = np.array([[0, 25, 30], [70, 0, 63], [70, 89, 0]])
print('原数组')
print(s3)
print('\n')
print('调用extract函数后返回索引值:')
print(np.extract(s2 > 30, s3))

# 输出结果
# 原数组
# [[ 0 25 30]
#  [70  0 63]
#  [70 89  0]]
# 
# 
# 调用extract函数后返回索引值:
# [70 63 70 89]

本章节,没有什么特别的难点,所以基本上我们就只需要知道函数在什么情况下进行使用,它的调用格式是什么样的,需要传递参数的意义就行了,还是那句话,眼过千遍,不如手过一遍,共勉!!!