自学内容网 自学内容网

【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)!