引言
本文将介绍几个python中常用的numpy函数:np.intersect1d ,np.setdiff1d, np.argwhere, np.argsort。首先给出numpy 的官网链接,方便大家查阅参考相关函数。
https://numpy.org/doc/stable/reference/
1. np.intersect1d
函数功能:求两个数组的交集。
函数原型:numpy.intersect1d(ar1, ar2, assume_unique=False, return_indices=False)
函数返回值:在ar1且在ar2中的排序的唯一值,一维数组。
>>>import numpy as np
>>>np.intersect1d([1, 3, 4, 3], [3, 1, 2, 1]) # array([1, 3])
>>>np.intersect1d([1, 2, 4, 9], [2, 4, 6, 8]) # array([2, 4])
>>>np.intersect1d([0, 1, 2, 3], [5, 6, 7, 8]) # array([], dtype=int32)
使用 numpy.in1d(ar1, ar2, assume_unique=False, invert=False)
也可以求取数组的交集,
下面的例子计算出了 states 在 test 中的元素,即 states 和 test 的交集。
>>> test = np.array([0, 1, 2, 5, 0])
>>> states = [0, 2]
>>> mask = np.in1d(test, states)
>>> mask
array([ True, False, True, False, True])
>>> test[mask]
array([0, 2, 0])
如果想对两个以上数组求交集,可以使用 functools.reduce 函数:
>>>from functools import reduce
>>>reduce(np.intersect1d, ([1, 3, 4, 3], [3, 1, 2, 1], [6, 3, 4, 2]))
# array([3])
2. numpy.setdiff1d
函数功能:求两个数组的差集。
函数原型:numpy.setdiff1d(ar1, ar2, assume_unique=False)
函数返回值:返回在ar1中不在ar2中的唯一值,一维数组。
如果 assume_unique=False,则对返回值去重,从小到大进行排序。
如果 assume_unique=True,则假定输入数组无重复的值,不对结果进行排序。
>>> a = np.array([1, 2, 3, 2, 4, 1])
>>> b = np.array([3, 4, 5, 6])
>>> c = np.array([1, 2, 3, 4])
>>> d = [0, 9, 7, 8]
>>> np.setdiff1d(a, b) # array([1, 2])
>>> np.setdiff1d(a, c) # array([], dtype=int32)
>>> np.setdiff1d(b, d) # array([3, 4, 5, 6])
3. numpy.argwhere
函数功能:查找按元素分组的非零数组元素的索引。
函数原型:numpy.argwhere(a)
函数返回值:非零元素的索引。索引数组的形状为(N,a.ndim),其中N是非零项的数目。
例1:
>>> x = np.arange(6).reshape(2,3)
>>> x
# array([[0, 1, 2],
# [3, 4, 5]])
>>> np.argwhere(x>1)
# array([[0, 2],
# [1, 0],
# [1, 1],
# [1, 2]], dtype=int64)
# 满足 x>1 的项数为4,数组维数为2, 因此函数返回数组shape 为(4, 2)
>>> np.argwhere(x>3)
# array([[1, 1],
# [1, 2]], dtype=int64)
>>> np.argwhere(x>=0)
# array([[0, 0],
# [0, 1],
# [0, 2],
# [1, 0],
# [1, 1],
# [1, 2]], dtype=int64)
例2:
>>> y = np.arange(8).reshape(2,2,2)
>>> y
# array([[[0, 1],
# [2, 3]],
#
# [[4, 5],
# [6, 7]]])
>>> np.argwhere(y>6)
# array([[1, 1, 1]], dtype=int64)
>>> np.argwhere(y>4)
# array([[1, 0, 1],
# [1, 1, 0],
# [1, 1, 1]], dtype=int64)
>>> np.argwhere(y>10)
# array([], shape=(0, 3), dtype=int64)
4. numpy.argsort
函数功能:返回对数组进行排序的索引.
函数原型:numpy.argsort(a, axis=-1, kind=None, order=None)
函数返回值:沿指定轴排序的索引数组。
例1:当 a 为一维数组时
>>> x = np.array([3, 1, 2])
>>> np.argsort(x)
# 默认按照升序排列
# array([1, 2, 0])
例2:当 a 为二维数组时
>>> x = np.array([[0, 3], [2, 2]])
>>> x
# array([[0, 3],
# [2, 2]])
>>> ind = np.argsort(x, axis=0) # 沿第一个轴排序 (down)
>>> ind
# array([[0, 1],
# [1, 0]])
>>> ind = np.argsort(x, axis=1) # 沿第二个轴排序 (across)
>>> ind
# array([[0, 1],
# [0, 1]])
axis 也被称作 维度(dim), 数组 x 是一个两行两列的数组。我们可以将二维数组 x 的第一个轴理解为行,第二个轴理解为列。因此沿第一个轴排序,即为按行排序(自上而下)。沿第二个轴排序,即为按列排序(自左至右)。