首页 > NumPy 阅读数:58

NumPy的去重与重复函数

在数据处理过程中,不可避免地会出现“脏”数据的情况,而重复数据就是“脏”数据的情况之一。在 NumPy 中,可以通过 unique() 函数找出数组中去重后的元素并返回已排序的数组,从而实现去除数组中重复数据的目的。

另外,在统计分析中,经常还会遇到需要将一个数据重复若干次的情况。在 NumPy 中,为了实现数据重复,可使用 tile() 函数和 repeat() 函数。下面将介绍是 NumPy 的去重与重复函数应用。

unique() 函数

unique() 函数可以返回输入数组中所有不同的值(即去重后的值),并且按照从小到大的顺序排列。即 unique() 函数能够返回由输入数组中的去重后的值组成的去重数组、去重数组的索引数组、去重数组的下标和去重值的重复数量等结果。

unique() 函数格式如下:

numpy.unique(arr,return_index,return_inverse,return_counts)

函数中主要参数说明如下:
  • 参数 arr 表示输入的数组,如果不是一维数组则会展开;
  • return_index 如果为 True,返回输入数组中去重数组的索引数组;
  • return_inverse 如果为 True,返回去重数组的下标,它可以用于重构输入数组;
  • return_counts 如果为 True,返回去重数组中的元素在原数组中的出现次数。

unique() 函数的示例代码 example1 如下。
# -*- coding: UTF-8 -*-
import numpy as np
#创建数组arr
arr = np.array([3,7,5,6,8,9,7,2,6,2,5,9,10])
print('第1个数组:',arr)
print('第1个数组的去重(去重后的值)数组:')
arr_u = np.unique(arr)
print(arr_u)
print('去重数组的索引数组:')
u_index = np.unique(arr, return_index=True)
print(u_index)

print('查看原数组中的元素相对于去重数组中的元素的索引值')
print('原数组',arr)
print('用去重数组下标标记原数组中元素:')
arr_u,u_inverse = np.unique(arr, return_inverse=True)
print(u_inverse)
print('使用去重数组下标重构原数组:')
print(arr_u[u_inverse])

print('返回去重后的值的重复数量:')
arr_u,u_inverse = np.unique(arr, return_counts=True)
print(u_inverse)

tile() 函数

tile() 函数是模板 numpy.lib.shape_base 中的函数。该函数的作用是将一个已有的数组重复一定的次数。该函数的格式如下:

numpy.tile(a,reps)

tile() 函数有 2 个参数,其中,参数a指定重复的数组;参数 reps 指定重复的次数。

tile() 函数的示例代码 example2 如下。
# -*- coding: UTF-8 -*-
import numpy as np
arr = np.array([10,20])
#输出 [10 20 10 20]
a = np.tile(arr,2)
#输出[[10 20 10 20],[10 20 10 20],[10 20 10 20]]
b = np.tile(arr,(3,2))
#输出[[42. 42.],[42. 42.],[42. 42.]]
c = np.tile(42.0,(3,2)) 
print(a,'\n',b,'\n',c)

repeat() 函数

repeat() 函数的格式如下:

numpy.repeat(a,repeats,axis=None)

repeat() 函数有 3 个参数,其中,参数 a 指定需要重复的数组元素;参数 repeats 指定重复的次数;参数 axis 指定沿着哪个轴进行重复。

repeat() 函数的示例代码 example3 如下。
# -*- coding: UTF-8 -*-
import numpy as np
a = np.repeat(7.,4) #输出[7. 7. 7. 7.]
arr = np.array([10,20]) #定义数组
b = np.repeat(arr,[3,2]) #输出[10 10 10 20 20]

arr = np.array([[10,20],[30,40]]) #定义数组
#沿轴 0 重复数据,输出[[10 20],[10 20],[10 20],[30 40],[30 40]]
c = np.repeat(arr,[3,2],axis=0)

#沿轴 1 重复数据,输出[[10 10 10 20 20],[30 30 30 40 40]]
d = arr.repeat([3,2],axis=1)
print('数据重复4次', a,'\n元素重复', b,'\n沿轴 0 重复数据',
     c, "\n 沿轴 1 重复数据", d)

tile() 函数和 repeat() 函数的主要区别在于,tile() 函数是对数组进行重复操作,而 repeat() 函数是对数组中的每个元素进行重复操作。