#全部行都能输出
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
import numpy as np
a是一个ndarray对象,可以是多维的数组, 但是高维的排序非常复杂, 我们这里只讲二维数组。
按照指定的轴进行升序。
a = np.array([[4, 2, 8],[1, 5, 6], [9, 3, 7], [1, 5, 2]])
a
array([[4, 2, 8], [1, 5, 6], [9, 3, 7], [1, 5, 2]])
np.sort(a) # 不指定的时候, 对行进行升序
array([[2, 4, 8], [1, 5, 6], [3, 7, 9], [1, 2, 5]])
np.sort(a, axis=0) # axis=0代表对列进行升序
array([[1, 2, 2], [1, 3, 6], [4, 5, 7], [9, 5, 8]])
np.sort(a, 1) # axis=0对列进行升序
array([[2, 4, 8], [1, 5, 6], [3, 7, 9], [1, 2, 5]])
返回的是数组值从小到大的索引值
a = np.array([[4, 2, 8],[1, 5, 6], [9, 3, 7], [1, 5, 2]])
a
array([[4, 2, 8], [1, 5, 6], [9, 3, 7], [1, 5, 2]])
np.argsort(a) # 默认对行进行升序
array([[1, 0, 2], [0, 1, 2], [1, 2, 0], [0, 2, 1]], dtype=int64)
array([[4, 2, 8], ==> 从小到大排序 2 4 8 ,对应的索引 1 0 2
[1, 5, 6], ==> 从小到大排序 1 5 6 ,对应的索引 0 1 2
[9, 3, 7], ==> 从小到大排序 3 7 9 ,对应的索引 1 2 0
[1, 5, 2]]) ==> 从小到大排序 1 2 5 ,对应的索引 0 2 1
np.argsort(a, 0) #axis=0队列进行升序
array([[1, 0, 3], [3, 2, 1], [0, 1, 2], [2, 3, 0]], dtype=int64)
array([[4, 2, 8],
[1, 5, 6],
[9, 3, 7],
[1, 5, 2]])
第一列 4 1 9 1 ==> 从小到大排序 1 1 4 9 ,对应的索引 1 3 0 2
第二列 2 5 3 5 ==> 从小到大排序 2 3 5 5 ,对应的索引 0 2 1 3
第三列 3 1 2 0 ==> 从小到大排序 0 1 2 3 ,对应的索引 3 1 2 0
a = [1,5,1,4,3,4,4] # First column # 升序是 1 1 3 4 4 4 5
b = [9,4,0,4,0,2,1] # Second column
a1 = np.array(a)
b1 = np.array(b)
a1
b1
array([1, 5, 1, 4, 3, 4, 4])
array([9, 4, 0, 4, 0, 2, 1])
ind = np.lexsort((b1, a1)) # Sort by a, then by b
ind
array([2, 0, 4, 6, 5, 3, 1], dtype=int64)
解释:
1 首先对a进行从小到大的排序 1 1 3 4 4 4 5 ==》对应的索引 0 2 4 3 5 6 1
2 但是, 我们发现有2个1 , 3个4, 如果是argsort()的话会按原本的位置进行排序, 但是lexsort()不会
3 lex()会利用b对应位置上的元素来进行排序
4 再来利用b来排序2个1, 两个1的索引是 0 2, 在b中对应的元素为 9 0,从小到大0 9 , 则索引会变成 2 0 4 3 5 6 1
5 再来利用b来排序3个4, 两个1的索引是 3 5 6, 在b中对应的元素为 4 2 1,从小到大1 2 4, 则索引会变成 2 0 4 6 5 3 1
返回指定轴上最大元素的索引
a = np.array([[30,40,70, 4],[80,20,10, 5],[50,90,60, 2]])
a
array([[30, 40, 70, 4], [80, 20, 10, 5], [50, 90, 60, 2]])
np.argmax(a) # 返回最大元素的所在的整体位置,相当于进行压缩成一维以后的位置
9
a.flatten() # 压缩成一维以后最大元素90的索引为7
array([30, 40, 70, 4, 80, 20, 10, 5, 50, 90, 60, 2])
a.flatten()[9]
90
np.argmax(a, axis = 0) #按列来求
np.argmax(a, axis = 1) #按行来求
array([1, 2, 0, 1], dtype=int64)
array([2, 0, 1], dtype=int64)
返回指定的轴上最小的索引
a = np.array([[30,40,70, 4],[80,20,10, 5],[50,90,60, 2]])
a
array([[30, 40, 70, 4], [80, 20, 10, 5], [50, 90, 60, 2]])
np.argmin(a) # 返回最大元素的所在的整体位置,相当于进行压缩成一维以后的位置
11
a.flatten()
array([30, 40, 70, 4, 80, 20, 10, 5, 50, 90, 60, 2])
a.flatten()[11]
2
np.argmin(a, axis = 0) #按列来求
np.argmin(a, axis = 1) #按行来求
array([0, 1, 1, 2], dtype=int64)
array([3, 3, 3], dtype=int64)
返回数组中非0元素的索引
a = np.array([[30,40,0,0],[0,20,0,10],[50,0,60, 0]])
a
array([[30, 40, 0, 0], [ 0, 20, 0, 10], [50, 0, 60, 0]])
np.nonzero(a) # #两个是分别按照axis=0,axis=1返回的索引 第一个数组是行,第二个数组是列!
(array([0, 0, 1, 1, 2, 2], dtype=int64), array([0, 1, 1, 3, 0, 2], dtype=int64))
a[[0, 0, 1, 1, 2, 2], [0, 1, 1, 3, 0, 2]]
array([30, 40, 20, 10, 50, 60])
a[np.nonzero(a)] # 可以通过这种方法找到所有的非0元素
array([30, 40, 20, 10, 50, 60])
返回输入数组中满足给定条件的元素的索引
x = np.arange(9.).reshape(3, 3)
x
array([[0., 1., 2.], [3., 4., 5.], [6., 7., 8.]])
np.where(x>3)
(array([1, 1, 2, 2, 2], dtype=int64), array([1, 2, 0, 1, 2], dtype=int64))
x[np.where(x>3)]
array([4., 5., 6., 7., 8.])
对数组元素进行去重
a = np.array([[1, 2, 3, 41, 2, 2, 1, 2], [1, 234, 3, 41, 2, 2, 1, 2], [1, 2, 3, 41, 2, 2, 1, 2]])
a
array([[ 1, 2, 3, 41, 2, 2, 1, 2], [ 1, 234, 3, 41, 2, 2, 1, 2], [ 1, 2, 3, 41, 2, 2, 1, 2]])
np.unique(a) # 相当于先压缩成一维在进行去重
array([ 1, 2, 3, 41, 234])