numpy task5排序搜索计数及集合操作

本文详细介绍了使用numpy库进行数组排序、查找最大/小值、非零元素计数、搜索插入位置以及各种搜索和计数函数的使用方法,包括argmax、argmin、nonzero、where、searchsorted和count_nonzero等。
摘要由CSDN通过智能技术生成

排序,搜索和计数

排序
  • numpy.sort(a[, axis=-1, kind=‘quicksort’, order=None]);
    • axis:排序沿数组的轴方向;
    • kind:排序的算法(快排,混排,堆排);
    • order:排序的字段名
import numpy as np

# np.random.seed()
x= np.random.rand(5,5)*10
x = np.around(x,2)
print(x)
print('+++++++++++')
y = np.sort(x)
print(y)

[[1.97 2.45 1.35 4.73 6.86]
[0.34 3.94 1.94 6.29 2.03]
[0.66 1.91 4.47 9.75 1.48]
[1.36 9. 4.22 2.39 1.11]
[2.42 3.77 4.97 3.11 7.09]]
+++++++++++
[[1.35 1.97 2.45 4.73 6.86]
[0.34 1.94 2.03 3.94 6.29]
[0.66 1.48 1.91 4.47 9.75]
[1.11 1.36 2.39 4.22 9. ]
[2.42 3.11 3.77 4.97 7.09]]

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

[(b’Bob’, 17) (b’Jane’, 27) (b’Mike’, 21) (b’Nancy’, 25)]
+++++++++
[(b’Bob’, 17) (b’Mike’, 21) (b’Nancy’, 25) (b’Jane’, 27)]

  • numpy.argsort(a[, axis=-1, kind=‘quicksort’, order=None])排序后返回索引值
x = np.random.randint(0,10,10)
print(x,'原数组')
print('+++++++++++')
print(np.argsort(x),'排序后数组的索引')
print('+++++++++++')
print(x[np.argsort(x)],'排序后的数组')

[4 4 2 6 9 2 6 7 6 0] 原数组
+++++++++++
[9 2 5 0 1 3 6 8 7 4] 排序后数组的索引
+++++++++++
[0 2 2 4 4 6 6 6 7 9] 排序后的数组

  • numpy.lexsort() 将数据按照某一指标进行排序
    • numpy.lexsort(key[,axis=-1])
    • 给定多个可以在电子表格中解释为列的排序键,lexsort返回一个整数索引数组,该数组描述了按多个列排序的顺序。序列中的最后一个键用于主排序顺序,倒数第二个键用于辅助排序顺序,依此类推。keys参数必须是可以转换为相同形状的数组的对象序列。如果为keys参数提供了2D数组,则将其行解释为排序键,并根据最后一行,倒数第二行等进行排序。
x = np.random.rand(5,5)*10
x = np.around(x,2)
print(x,'原数组')
index = np.lexsort([x[:,0]])
print(index,'升序排序后的索引')
print(x[index],'升序排序后的数组')

[[5.5 2.66 3.25 9.25 5.12]
[5.38 9.07 3.2 4.3 8.49]
[8.95 4.58 9.09 4.91 5.95]
[5.19 9.85 7.69 2. 9.32]
[1.6 1.17 9.12 6.72 2.52]] 原数组
[4 3 1 0 2] 升序排序后的索引
[[1.6 1.17 9.12 6.72 2.52]
[5.19 9.85 7.69 2. 9.32]
[5.38 9.07 3.2 4.3 8.49]
[5.5 2.66 3.25 9.25 5.12]
[8.95 4.58 9.09 4.91 5.95]] 升序排序后的数组

x = 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,'以x序列排序')
print(b,'以y序列排序')
z = np.lexsort([x,y])
print(z,'排序会根据最后一个字段作为主要排序序列')

[0 2 4 3 5 6 1] 以x序列排序
[2 4 6 5 1 3 0] 以y序列排序
[2 4 6 5 3 1 0] 排序会根据最后一个字段作为主要排序序列

  • numpy.partition(a, kth, axis=-1, kind=‘introselect’, order=None)
# 以索引是 kth 的元素为基准,将元素分成两部分,即大于该元素的放在其后面,小于该元素的放在其前面,这里有点类似于快排。
x = np.random.randint(1, 30, [8, 3])
print(x,'原数组')

y = np.sort(x, axis=0)
print(y,'排序后的数组')

z = np.argpartition(x, kth=2, axis=0)
print(z,'利用索引kth为基准排序后的数组')

[[11 1 18]
[21 25 12]
[24 1 9]
[21 9 12]
[12 16 1]
[16 18 13]
[15 27 17]
[19 2 13]] 原数组
[[11 1 1]
[12 1 9]
[15 2 12]
[16 9 12]
[19 16 13]
[21 18 13]
[21 25 17]
[24 27 18]] 排序后的数组
[[0 0 4]
[4 2 2]
[6 7 1]
[3 3 3]
[1 4 0]
[5 5 5]
[2 6 6]
[7 1 7]] 利用索引kth为基准排序后的数组

  • numpy.argpartition(a, kth, axis=-1, kind=‘introselect’, order=None) 同上函数,区别在于返回值是索引
搜索
  • numpy.argmax(a[, axis=None, out=None])
  • numpy.argmin(a[, axis=None, out=None])
x=np.random.rand(5,5)*10
x=np.around(x,2)
print(x,'原数组')
print(np.argmax(x),'最大数的序列号')
print(np.argmin(x),'最小数的序列号')

[[5.74 7.49 9.57 3.47 9.98]
[4.76 5.7 4.9 8.46 3.97]
[2.63 8.26 6.47 7. 5.24]
[0.75 0.95 9.49 3.22 4.38]
[5.28 3.45 2.25 9.78 1.97]] 原数组
4 最大数的序列号
15 最小数的序列号

  • numppy.nonzero(a) 返回其值为非零元素的下标在对应轴上的值。
    • 只有a中非零元素才会有索引值,那些零值元素没有索引值。
    • 返回一个长度为a.ndim的元组(tuple),元组的每个元素都是一个整数数组(array)。
    • 每一个array均是从一个维度上来描述其索引值。比如,如果a是一个二维数组,则tuple包含两个array,第一个array从行维度来描述索引值;第二个array从列维度来描述索引值。
    • 该 np.transpose(np.nonzero(x)) 函数能够描述出每一个非零元素在不同维度的索引值。
    • 通过a[nonzero(a)]得到所有a中的非零值。
x = np.array([[3, 0, 0], [0, 4, 0], [5, 6, 0]])
print(x,'原数组')

print(x.shape)  # (3, 3)
print(x.ndim)  # 2

y = np.nonzero(x)
print(y,'分别从两个维度标记了原数组中4个非零数的索引位置')

[[3 0 0]
[0 4 0]
[5 6 0]] 原数组
(3, 3)
2
(array([0, 1, 2, 2], dtype=int64), array([0, 1, 0, 1], dtype=int64)) 分别从两个维度标记了原数组中4个非零数的索引位置

  • numpy.where(condition, [x=None, y=None]) 条件筛选
import numpy as np

x = np.array([[0, 1, 2],
              [0, 2, 4],
              [0, 3, 6]])
y = np.where(x < 4, x, -1)
print(y,'满足条件的数字不变,不满足条件的数字变为-1')

[[ 0 1 2]
[ 0 2 -1]
[ 0 3 -1]] 满足条件的数字不变,不满足条件的数字变为-1

  • numpy.searchsorted(a, v[, side=‘left’, sorter=None]) 搜索排序
    • a:一维输入数组。当sorter参数为None的时候,a必须为升序数组;否则,sorter不能为空,存放a中元素的index,用于反映a数组的升序排列方式。
    • v:插入a数组的值,可以为单个元素,list或者ndarray。
    • side:查询方向,当为left时,将返回第一个符合条件的元素下标;当为right时,将返回最后一个符合条件的元素下标。
    • sorter:一维数组存放a数组元素的 index,index 对应元素为升序。
x = np.array([0, 1, 5, 9, 11, 18, 26, 33])
y = np.searchsorted(x, 15)
print(y,'第一个满足条件的索引值')
print('+++++++++++')
x = np.array([0, 1, 5, 9, 11, 18, 26, 33])
np.random.shuffle(x)
print(x,'打乱顺序后的数组')  

x_sort = np.argsort(x)
print(x_sort,'排序后的索引值') 

y = np.searchsorted(x, [-1, 0, 11, 15, 33, 35], sorter=x_sort)
print(y,'从左往右找满足条件的索引值')  

y = np.searchsorted(x, [-1, 0, 11, 15, 33, 35], side='right', sorter=x_sort)
print(y,'从右往左找满足条件的索引值') 

5 第一个满足条件的索引值
+++++++++++
[ 1 33 5 0 18 9 26 11] 打乱顺序后的数组
[3 0 2 5 7 4 6 1] 排序后的索引值
[0 0 4 5 7 8] 从左往右找满足条件的索引值
[0 1 5 5 8 8] 从右往左找满足条件的索引值

计数
  • numpy.count_nonzero(a, axis=None) 返回非零元素个数
x = np.count_nonzero([[0, 1, 7, 0, 0], [3, 0, 0, 2, 19]])
print(x,'统计所有非零元素个数')

x = np.count_nonzero([[0, 1, 7, 0, 0], [3, 0, 0, 2, 19]], axis=0)
print(x,'按行统计非零元素个数')

5 统计所有非零元素个数
[1 1 1 1 1] 按行统计非零元素个数

集合操作

构造集合
  • numpy.unique(ar, return_index=False, return_inverse=False, return_counts=False, axis=None)
    • return_index=True 表示返回新列表元素在旧列表中的位置。
    • return_inverse=True 表示返回旧列表元素在新列表中的位置。
    • return_counts=True 表示返回新列表元素在旧列表中出现的次数。
import numpy as np

x = np.unique([1, 1, 3, 2, 3, 3])
print(x)

[1 2 3]

布尔运算
  • numpy.in1d(ar1, ar2, assume_unique=False, invert=False)
test = np.array([0, 1, 2, 5, 0])
states = [0, 2]
mask = np.in1d(test, states)
print(mask)
print(test[mask])

[ True False True False True]
[0 2 0]

求两个集合的交集
  • numpy.intersect1d(ar1, ar2, assume_unique=False, return_indices=False)
x = np.intersect1d([1, 3, 4, 3], [3, 1, 2, 1])
print(x)

[1 3]

求两个集合的并集
  • numpy.union1d(ar1, ar2)
x = np.union1d([-1, 0, 1], [-2, 0, 2])
print(x)

[-2 -1 0 1 2]

求两个集合的差集
  • numpy.setdiff1d(ar1, ar2, assume_unique=False)
a = np.array([1, 2, 3, 2, 4, 1])
b = np.array([3, 4, 5, 6])
x = np.setdiff1d(a, b)
print(x) 

[1 2]

求两个集合的异或
  • setxor1d(ar1, ar2, assume_unique=False)
a = np.array([1, 2, 3, 2, 4, 1])
b = np.array([3, 4, 5, 6])
x = np.setxor1d(a, b)
print(x) 

[1 2 5 6]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BigCabbageFy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值