【Python】numpy:唯一值、排序、倒置、判断数组中元素是否在另一个数组中、两数组的交集/并集/差集/异域集、获取/修改数据(含索引/切片)
Numpy是Python的扩展库(第三方库),支持维度数组和矩阵运算,是运算速度很快的数学库。
Numpy官方文档:NumPy user guide — NumPy v2.0 Manual
帮助:可使用help(...)查看函数说明文档(若是第三方库的函数,需先导入库)。例如:help(np.array)
Python代码中,导入numpy:
import numpy as np
1、唯一值
unique(ar, return_index=False, return_inverse=False, return_counts=False, axis=None)
Returns : ndarray【参数只有数组的情况】,
(ndarray, optional)【返回元组形式,参数return_index/return_inverse/return_counts=True的情况】
- np.unique(数组): 去重,获取唯一值(已排序)。
- np.unique(数组, return_index=True): 去重,获取唯一值(已排序)和唯一值在原数组中第一次出现的索引号。返回元组形式。
- np.unique(数组, return_inverse=True): 去重,获取唯一值(已排序)和原数组中各元素在新数组中的索引号。返回元组形式。
- np.unique(数组, return_counts=True): 去重,获取唯一值(已排序)和唯一值在原数组中出现次数。返回元组形式。
2、排序
(2-1)指定轴、指定字段,排序
sort(a, axis=-1, kind=None, order=None)
Returns : ndarray
- np.sort(数组):排序。默认按最后一个维度排序(例如:二维数组,最后一个维度是列,即每行的各列元素排序)。默认快排方式。
- np.sort(数组, axis=0):按行排序,即每列的各行元素排序。
- np.sort(数组, axis=1):按列排序,即每行的各列元素排序。
- np.sort(数组, axis=None):转为一维数组排序。
- np.sort(数组, order=字段):指定字段排序。默认按最后一个维度排序。
- np.sort(数组, order=[字段1, 字段2,...]):指定多个字段排序(先按字段1排,字段1的值相同,再按字段2排,...)。默认按最后一个维度排序。
- 也可以数组.sort(...)。但np.sort(...)不会修改原数组,数组.sort(...)会改变原数组。
(2-2)指定轴、指定字段,排序(返回索引号)
argsort(a, axis=-1, kind=None, order=None)
Returns : ndarray, int
np.argsort(...):
- 使用方法与np.sort(...)相同。区别如下:
- 返回排序后各元素在原数组中的索引号。
- 若降序排列,第一个参数(即数组)前面加负号。
- 等效方法:数组.argsort(...)。
补充: np.argsort(...)和np.take_along_axis(...)一起用,类似于np.sort(...)效果。
take_along_axis(arr, indices, axis)
Returns: ndarray (Ni..., J, Nk...)
np.take_along_axis(数组, 索引号, axis=指定轴): 获取排序后的数组,不影响原数组。参数中的索引号可以是np.argsort(...)的结果。
即:先通过np.argsort(...)获取排序后的元素在原数组中的索引号,再通过np.take_along_axis(...)根据索引号获得排序后的数组。
(2-3)多个序列(都作为列)排序(返回索引号)
lexsort(keys, axis= -1)
Returns: (N,) ndarray of ints
np.lexsort( (序列1, 序列2) ):每个序列作为列,优先按照靠后的序列排序,即先按序列2排序,若值相同,再按序列1排序。默认按最后一个维度排序。返回索引号数组。
3、倒置(从头到尾变为从尾到头倒序)
flip(m, axis=None)
Returns: array_like
- np.flip(数组):数组所有轴所有元素全部倒置,第一行变最后一行,第一列变最后一列。若是二维数组类似于np.flip(数组, axis=(0,1))。
- np.flip(数组, axis=0):数组按行轴倒置,列不变,每列的各行元素倒置。
- np.flip(数组, axis=1):数组按列轴倒置,行不变,每行的各列元素倒置。
- np.flip(数组[行索引/切片, 列索引/切片]):数组指定区域的所有轴所有元素全部倒置。
- np.flip(数组[行索引/切片, 列索引/切片], axis=0):数组指定区域按行轴倒置。
- np.flip(数组[行索引/切片, 列索引/切片], axis=1):数组指定区域按列轴倒置。
4、判断数组中元素是否在另一个数组中
(4-1)一维数组各元素是否在另一个一维数组中
in1d(ar1, ar2, assume_unique=False, invert=False)
Returns: (M,) ndarray, bool
- np.in1d(一维数组,一维数组或列表):判断一维数组是否在另一个一维数组或列表中,若在 则True,不在则False。返回布尔类型的数组。
- np.in1d(一维数组,一维数组或列表,invert=True):判断一维数组是否不在另一个一维数组或列表中,若不在 则True,在则False。返回布尔类型的数组。
- 参数assume_unique=False,默认结果已去重。
(4-2)数组各元素是否在另一个数组中
isin(element, test_elements, assume_unique=False, invert=False)
Returns: ndarray, bool
- np.isin(数组,数组或列表):判断数组是否在另一个数组或列表中,若在 则True,不在则False。返回布尔类型的数组。
- np.isin(数组,数组或列表,invert=True):判断数组是否不在另一个数组或列表中,若不在 则True,在则False。返回布尔类型的数组。
- 参数assume_unique=False,默认结果已去重。
- 若参数test_elements是集合,需转为列表,需是有序序列。
5、两数组的交集、并集、差集、异域集
(5-1)交集
intersect1d(ar1, ar2, assume_unique=False, return_indices=False)
Returns : ndarray
注:只适用于2个数组之间求交集。结果已排序。
- np.intersect1d(数组1, 数组2):获取数组1和数组2的共有元素(即两数组都有的数据)。
- np.intersect1d(数组1, 数组2, return_indices=True):获取数组1和数组2的共有元素和分别在两数组中的索引号。返回元组形式,(共有元素,共有元素在数组1中的索引号,共有元素在数组2中的索引号)。
- 若求多个数组之间的交集,使用functools库的reduce函数,即 functools.reduce(np.intersect1d, (数组1, 数组2, 数组3, ...))。
- 参数assume_unique=False,默认结果已去重。
(5-2)并集
union1d(ar1, ar2)
Returns : ndarray
注:只适用于2个数组之间求并集。结果去重且已排序。
- np.union1d(数组1, 数组2):获取数组1和数组2的所有元素(去重,且排序)。
- 若求多个数组之间的交集,使用functools库的reduce函数,即 functools.reduce(np.union1d, (数组1, 数组2, 数组3, ...))。
(5-3)差集
setdiff1d(ar1, ar2, assume_unique=False)
Returns : ndarray
- np.setdiff1d(数组1, 数组2):从数组1中获取数组2中没有的元素。
- np.setdiff1d(数组2, 数组1):从数组2中获取数组1中没有的元素。
- 两数组的顺序影响结果。
- 参数assume_unique=False,默认结果已去重。结果已排序。
(5-4)异域集
setxor1d(ar1, ar2, assume_unique=False)
Returns : ndarray
- np.setxor1d(数组1, 数组2):数组1和数组2中获取交集以外的元素,即数组1有且数组2没有 和 数组2有且数组1没有的元素。
- 参数assume_unique=False,默认结果已去重。结果已排序。
6、获取数据或修改数据
(6-1)数组可以通过索引或切片,来获取数据或修改数据。
索引:
- 一维数组:数组[索引号]。
- 二维数组:数组[行索引号, 列索引号]。
- 注:索引号从0开始。最后一个元素的索引号可用 -1表示。
切片:
- 一维数组:数组[起始索引号 : 结束索引号]。
- 二维数组:数组[起始行索引号 : 结束行索引号 , 起始列索引号 : 结束列索引号]。
- 注:① 包含起始索引的值,不含结束索引的值。② 索引号从0开始。最后一个元素的索引号可用 -1表示。③ 若没有起始索引号,则从0开始。若没有结束索引号,则到最后为止。
(6-2)通过条件获取数据或修改数据
- 条件返回的是数组中每个元素的判断结果(True或者False)。
- 再作为索引获取True对应的值。
- 若多个条件,可使用且(&)、或(|)。
(6-3)通过np.nonzero(...)获取非零的数据,也可以获取满足条件的数据
nonzero(a)
Returns : tuple
np.nonzero(数组):
- 获取非零数据的索引号。
- 返回元组(有2个元素),一个非零数据的行索引号,一个非零数据的列索引号。
np.nonzero(条件):
- 返回元组(有2个元素),一个满足条件的行索引号,一个满足条件的列索引号。
- 若多个条件,可使用且(&)、或(|)。
原文地址:https://blog.csdn.net/yannan20190313/article/details/140423358
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!