首页Python【Python数据分析】1...

【Python数据分析】11.数组排序操作


本系列文章配套代码获取有以下三种途径:

  • 可以在以下网站查看,该网站是使用JupyterLite搭建的web端Jupyter环境,因此无需在本地安装运行环境即可使用,首次运行浏览器需要下载一些配置文件(大约20M):

https://returu.github.io/Python_Data_Analysis/lab/index.html
链接:https://pan.baidu.com/s/1MYkeYeVAIRqbxezQECHwcA?pwd=mnsj 提取码:mnsj
  • 前往GitHub详情页面,单击 code 按钮,选择Download ZIP选项:
https://github.com/returu/Python_Data_Analysis

根据《Python for Data Analysis 3rd Edition》翻译整理

—————-————————————-

1.sort()方法:

和Python列表对象类似,Numpy数组也可以使用sort()方法进行生序排列。

ndarray实例对象的sort方法,会对原有数组进行重排列,而不是返回一个新的数组对象。

 1>>> arr = np.random.randn(3,4)
2>>> arr
3array([[-1.00750391, -0.32094115, -0.03034299, -0.50093828],
4       [ 0.38724458,  0.41708784,  0.72765547, -0.79893206],
5       [-1.0404649 ,  0.72726869, -0.33227455, -0.51267791]]
)
6
7>>> arr.sort()
8>>> arr
9array([[-1.00750391, -0.50093828, -0.32094115, -0.03034299],
10       [-0.79893206,  0.38724458,  0.41708784,  0.72765547],
11       [-1.0404649 , -0.51267791, -0.33227455,  0.72726869]]
)

顶层的np.sort()方法返回的是已经排序好的数组拷贝副本,而不会对原数组进行重排列。

 1>>> arr = np.random.randn(3,4)
2>>> arr
3array([[ 0.51549219, -0.73507244, -0.74865696,  0.1459806 ],
4       [-1.49291753,  0.58386771,  1.82306737,  0.37704324],
5       [-0.79483826,  0.20976823,  1.16073258, -0.6924981 ]]
)
6
7>>> np.sort(arr)
8array([[-0.74865696, -0.73507244,  0.1459806 ,  0.51549219],
9       [-1.49291753,  0.37704324,  0.58386771,  1.82306737],
10       [-0.79483826, -0.6924981 ,  0.20976823,  1.16073258]]
)
11
12# 原数组未变化
13>>> arr
14array([[ 0.51549219, -0.73507244, -0.74865696,  0.1459806 ],
15       [-1.49291753,  0.58386771,  1.82306737,  0.37704324],
16       [-0.79483826,  0.20976823,  1.16073258, -0.6924981 ]]
)

也可以使用axis参数,对指定轴进行排序。

 1>>> arr = np.random.randn(3,4)
2>>> arr
3array([[ 0.02016259, -0.88519477,  0.18271565, -0.48720066],
4       [ 1.13585177,  0.84505628,  0.66586759,  0.72760203],
5       [-1.71443987, -0.33173916, -2.69395075,  0.49404124]]
)
6
7>>> arr.sort(axis=0)
8
9>>> arr
10array([[-1.71443987, -0.88519477, -2.69395075, -0.48720066],
11       [ 0.02016259, -0.33173916,  0.18271565,  0.49404124],
12       [ 1.13585177,  0.84505628,  0.66586759,  0.72760203]]
)

2.间接排序:

在数据分析中,可能需要通过一个或多个键对数据进行排序操作。

  • argsort()——返回对数组进行排序的整数索引

 1>>> arr = np.random.randn(4)
2>>> arr
3array([ 0.23219428, -1.10602896, -0.19865998,  0.25639759])
4
5>>> indexer = arr.argsort()
6>>> indexer
7array([1203], dtype=int64)
8
9>>> arr[indexer]
10array([-1.10602896, -0.19865998,  0.23219428,  0.25639759])
  • lexsort()——使用多键数组执行间接稳定排序

lexsort()需要注意的是,用于排序数据的键的顺序是从传递的最后一个数组开始的。

1>>> first = np.array(['Bo''Ja''St''Bl''Ba'])
2>>> last = np.array(['Po''Ar''Ak''Po''Ta'])
3
4>>> sorter = np.lexsort((first , last))
5>>> sorter
6array([21304], dtype=int64)
7
8>>> list(zip(last[sorter], first[sorter]))
9[('Ak''St'), ('Ar''Ja'), ('Po''Bl'), ('Po''Bo'), ('Ta''Ba')]

3.数组的部分排序:

NumPy 中np.partition()np.argpartition()方法,用于围绕第 k 个最小元素对数组进行分区。

  • np.partition()——返回结果中的前k个元素为最小的k个值

1>>> arr = np.array([-1,-2,-5,-9,-7,5,2,6])
2>>> arr
3array([-1, -2, -5, -9, -7,  5,  2,  6])
4
5np.partition(arr , 2)
6array([-9, -7, -5, -1, -2,  5,  2,  6])
  • np.argpartition()——返回结果中的前k个元素为最小的k个值的索引值

1>>> indices = np.argpartition(arr,2)
2>>> indices
3array([34201567], dtype=int64)
4
5>>> arr[indices]
6array([-9, -7, -5, -1, -2,  5,  2,  6])
7
8>>> arr.take(indices)
9array([-9, -7, -5, -1, -2,  5,  2,  6])

4.在已排序的数组中寻找元素:

np.searchsorted()方法用于对已排序的数组执行二分搜索,返回数组中需要插入值以保持排序的位置索引。

可以传递单个值,也可以传递一个值数组,当传递的值与原数组中的值相同时,默认返回原数组相同值左侧的索引。

 1>>> arr = np.array([0151015])
2
3# 可以传递单个值
4>>> arr.searchsorted(9)
53
6
7# 可以传递一个值数组
8# 当传递的值与原数组中的值相同时,默认返回原数组相同值左侧的索引
9>>> arr.searchsorted([1,3,9,20])
10array([1235], dtype=int64)

作为该方法的一个小应用,可以用来分隔数据的单独的“桶边界”数组。

 1>>> bins = np.array([0,10,50,100])
2>>> bins
3array([  0,  10,  50100])
4
5>>> data = np.random.uniform(0100, size=10)
6>>> data
7array([ 9.8382421231.4536514954.7401141161.3210329297.61036597,
8        4.43257959,  1.1546336693.3776364285.3406213871.21061072])
9
10# 其中,1代表区间[0,10),以此类推
11>>> labels = bins.searchsorted(data)
12>>> labels
13array([1233311333], dtype=int64)


本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments