本系列文章配套代码获取有以下三种途径:
-
可以在以下网站查看,该网站是使用JupyterLite搭建的web端Jupyter环境,因此无需在本地安装运行环境即可使用,首次运行浏览器需要下载一些配置文件(大约20M):
https://returu.github.io/Python_Data_Analysis/lab/index.html
-
也可以通过百度网盘获取,需要在本地配置代码运行环境,环境配置可以查看【Python基础】2.搭建Python开发环境:
链接: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([1, 2, 0, 3], 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([2, 1, 3, 0, 4], 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([3, 4, 2, 0, 1, 5, 6, 7], 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([0, 1, 5, 10, 15])
2
3# 可以传递单个值
4>>> arr.searchsorted(9)
53
6
7# 可以传递一个值数组
8# 当传递的值与原数组中的值相同时,默认返回原数组相同值左侧的索引
9>>> arr.searchsorted([1,3,9,20])
10array([1, 2, 3, 5], dtype=int64)
作为该方法的一个小应用,可以用来分隔数据的单独的“桶边界”数组。
1>>> bins = np.array([0,10,50,100])
2>>> bins
3array([ 0, 10, 50, 100])
4
5>>> data = np.random.uniform(0, 100, size=10)
6>>> data
7array([ 9.83824212, 31.45365149, 54.74011411, 61.32103292, 97.61036597,
8 4.43257959, 1.15463366, 93.37763642, 85.34062138, 71.21061072])
9
10# 其中,1代表区间[0,10),以此类推
11>>> labels = bins.searchsorted(data)
12>>> labels
13array([1, 2, 3, 3, 3, 1, 1, 3, 3, 3], dtype=int64)
本篇文章来源于微信公众号: 码农设计师