本系列文章配套代码获取有以下三种途径:
-
可以在以下网站查看,该网站是使用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》翻译整理
—————-————————————-
数组的集合操作主要包括唯一值与其他集合逻辑,Numpy中的集合函数主要有以下几种:
函数方法 |
说明 |
unique(x) | 计算x中的唯一值并排序 |
intersect1d(x, y) | 计算x和y的交集,并排序 |
union1d(x, y) | 计算x和y的并集,并排序 |
setdiff1d(x, y) | 计算x和y的差集,在x中但是不在y中的元素 |
setxor1d(x, y) | 计算x和y的异或集,在x或y中,但是不属于x和y交集的元素 |
in1d(x, y) | 计算x中的元素是否包含在y中,返回布尔型数组 |
isin(x, y) | 计算x中的元素是否在y中,返回布尔型数组 |
1.唯一值:
numpy.unique(arr,return_index=False,return_inverse=False,return_counts=False,axis=None)
该函数返回一个数组中经过排序的唯一元素。
1>>> np.unique([1, 1, 2, 2, 3, 3])
2array([1, 2, 3])
3
4
5>>> arr = np.array([[1,1,3], [2,3,2]])
6>>> arr
7array([[1, 1, 3],
8 [2, 3, 2]])
9>>> np.unique(arr)
10array([1, 2, 3])
可以通过指定轴axis=0,去除二维数组的重复行。
1>>> arr_2d = np.array([[1, 2, 3], [1, 2, 3], [3, 4, 5]])
2>>> arr_2d
3array([[1, 2, 3],
4 [1, 2, 3],
5 [3, 4, 5]])
6
7>>> np.unique(arr_2d ,axis=0)
8array([[1, 2, 3],
9 [3, 4, 5]])
除了唯一元素外,还有三个可选的输出。
-
return_index
返回唯一值在输入数组中的索引
1>>> arr = np.array([[1, 2, 3], [1, 2, 3], [3, 4, 5]])
2>>> arr
3array([[1, 2, 3],
4 [1, 2, 3],
5 [3, 4, 5]])
6
7>>> np.unique(arr, return_index=True)
8(array([1, 2, 3, 4, 5]), array([0, 1, 2, 7, 8], dtype=int64))
-
return_inverse
根据唯一的值的索引重构输入数组
1>>> arr = np.array([[1, 2, 3], [1, 2, 3], [3, 4, 5]])
2>>> arr
3array([[1, 2, 3],
4 [1, 2, 3],
5 [3, 4, 5]])
6
7>>> np.unique(arr, return_inverse=True)
8(array([1, 2, 3, 4, 5]), array([0, 1, 2, 0, 1, 2, 2, 3, 4], dtype=int64))
-
return_counts
计算每个唯一值在输入数组中出现的次数
1>>> arr = np.array([[1, 2, 3], [1, 2, 3], [3, 4, 5]])
2>>> arr
3array([[1, 2, 3],
4 [1, 2, 3],
5 [3, 4, 5]])
6
7>>> np.unique(arr, return_counts=True)
8(array([1, 2, 3, 4, 5]), array([2, 2, 3, 1, 1], dtype=int64))
2.其他集合逻辑:
-
计算x和y的交集、差集、并集、异或集。
1# 计算x和y的交集,并排序
2>>> np.intersect1d([1, 3, 4, 3], [3, 1, 2, 1])
3array([1, 3])
4
5# 计算x和y的并集,并排序
6>>> np.union1d([1, 3, 4, 3], [3, 1, 2, 1])
7array([1, 2, 3, 4])
8
9# 计算x和y的差集,在x中但是不在y中的元素
10>>> np.setdiff1d([1, 3, 4, 3], [3, 1, 2, 1])
11array([4])
12
13# 计算x和y的异或集,在x或y中,但是不属于x和y交集的元素
14>>> np.setxor1d([1, 3, 4, 3], [3, 1, 2, 1])
15array([2, 4])
-
如果需要计算两个以上数组的交集和并集需要使用Python中的Functools模块。
1>>> from functools import reduce
2
3# 计算x、y、z的交集
4>>> reduce(np.intersect1d , ([1, 3, 4, 3], [3, 1, 2, 1], [6, 3, 4, 2]))
5array([3])
6
7# 计算x、y、z的并集
8>>> reduce(np.union1d , ([1, 3, 4, 3], [3, 1, 2, 1], [6, 3, 4, 2]))
9array([1, 2, 3, 4, 6])
-
in1d(arr1,arr2)
测试一维数组的每个元素是否存在于第二个数组中。
1>>> test = np.array([0, 1, 2, 5, 0])
2>>> states = [0, 2]
3
4>>> mask = np.in1d(test, states)
5>>> mask
6array([ True, False, True, False, True])
7>>> test[mask]
8array([0, 2, 0])
9
10# invert参数如果为 True,则返回数组中的值被反转(即,如果 ar1 的元素在 ar2 中,则为 False,否则为 True)。默认为假。
11>>> mask = np.in1d(test, states, invert=True)
12>>> mask
13array([False, True, False, True, False])
14>>> test[mask]
15array([1, 5])
-
isin(element, test_elements)
返回一个与 element 形状相同的布尔数组,如果 element 的元素在 test_elements 中,则为 True,否则为 False。
1>>> element = 2*np.arange(4).reshape((2, 2))
2>>> element
3array([[0, 2],
4 [4, 6]])
5
6>>> test_elements = [1, 2, 4, 8]
7
8>>> mask = np.isin(element, test_elements)
9>>> mask
10array([[False, True],
11 [ True, False]])
12
13>>> element[mask]
14array([2, 4])
本篇文章来源于微信公众号: 码农设计师