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

【Python数据分析】10.数组的集合操作


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

  • 可以在以下网站查看,该网站是使用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》翻译整理

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

数组的集合操作主要包括唯一值与其他集合逻辑,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([112233])
2array([123])
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([123])

可以通过指定轴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([12345]), array([01278], 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([12345]), array([012012234], 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([12345]), array([22311], dtype=int64))

2.其他集合逻辑:

  • 计算x和y的交集、差集、并集、异或集。

 1# 计算xy的交集,并排序
2>>> np.intersect1d([1, 3, 4, 3][3, 1, 2, 1])
3array([1, 3])
4
5# 计算xy的并集,并排序
6>>> np.union1d([1, 3, 4, 3][3, 1, 2, 1])
7array([1, 2, 3, 4])
8
9# 计算xy的差集,在x中但是不在y中的元素
10>>> np.setdiff1d([1, 3, 4, 3][3, 1, 2, 1])
11array([4])
12
13# 计算xy的异或集,在xy中,但是不属于xy交集的元素
14>>> np.setxor1d([1, 3, 4, 3][3, 1, 2, 1])
15array([2, 4])
  • 如果需要计算两个以上数组的交集和并集需要使用Python中的Functools块。

1>>> from functools import reduce
2
3# 计算xyz的交集
4>>> reduce(np.intersect1d , ([1, 3, 4, 3][3, 1, 2, 1][6, 3, 4, 2]))
5array([3])
6
7# 计算xyz的并集
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)测试一维数组的每个元素是否存在于第二个数组中。

返回一个与 arr1 长度相同的布尔数组,当 arr1 的元素在 arr2 中时为 True,否则为 False。
 1>>> test = np.array([01250])
2>>> states = [02]
3
4>>> mask = np.in1d(test, states)
5>>> mask
6array([ TrueFalse,  TrueFalse,  True])
7>>> test[mask]
8array([020])
9
10# invert参数如果为 True,则返回数组中的值被反转(即,如果 ar1 的元素在 ar2 中,则为 False,否则为 True)。默认为假。
11>>> mask = np.in1d(test, states, invert=True)
12>>> mask
13array([False,  TrueFalse,  TrueFalse])
14>>> test[mask]
15array([15])
  • isin(element, test_elements)返回一个与 element 形状相同的布尔数组,如果 element 的元素在 test_elements 中,则为 True,否则为 False。

 1>>> element = 2*np.arange(4).reshape((22))
2>>> element
3array([[02],
4       [46]])
5
6>>> test_elements = [1248]
7
8>>> mask = np.isin(element, test_elements)
9>>> mask
10array([[False,  True],
11       [ True, False]])
12
13>>> element[mask]
14array([24])


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

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments