np.unique

np.unique(ar, return_index=False, return_inverse=False, return_counts=False,axis=None) 
>>> import numpy as np>>> a=np.random.normal(size=(10))>>> aarray([-0.11357244,  0.95701868, -1.22541056,  0.17625916, -1.16635707,       -1.51826177,  0.83400888, -0.18158241, -0.84685022,  0.09911596]) 
首先,随机生成一个一维数组》 
然后分别看看函数中每个参数的作用 
第一个,不使用参数时 
>>> np.unique(a, return_index=False, return_inverse=False, return_counts=False,axis=None)array([-1.51826177, -1.22541056, -1.16635707, -0.84685022, -0.18158241,       -0.11357244,  0.09911596,  0.17625916,  0.83400888,  0.95701868]) 
而此时a为: 
>>> aarray([-0.11357244,  0.95701868, -1.22541056,  0.17625916, -1.16635707,       -1.51826177,  0.83400888, -0.18158241, -0.84685022,  0.09911596]) 
 也就是说这个函数没有改变原数组 
实现了对数组排序。同时我们使用另一个矩阵看看。 
>>> b=np.random.randint(0,5, size=(10))>>> barray([1, 4, 3, 0, 1, 0, 0, 1, 4, 4])>>> np.unique(b)array([0, 1, 3, 4]) 
对于含有重复元素的数组,提取其中所有出现元素,并且返回排序后结果。 
对于二维数组: 
>>> c=np.random.randint(0,5,size=(3,4))>>> np.unique(c)array([0, 1, 2, 3, 4])>>> carray([[1, 0, 2, 4],       [1, 3, 3, 1],       [1, 4, 0, 1]]) 
可见也是一样的。 
现在看看参数的作用: 
return_index=True 
>>> np.unique(b, return_index=True)(array([0, 1, 3, 4]), array([3, 0, 2, 1], dtype=int64)) 
除了返回不含重复元素的一维数组,还有一个数组,对应前面那个一维数组中元素第一次出现的位置。 
对于二维数组: 
>>> np.unique(c, return_index=True)(array([0, 1, 2, 3, 4]), array([1, 0, 2, 5, 3], dtype=int64)) 
可以看见它是先把矩阵拉伸成一维数组,然后再排。(按行展) 
return_inverse=True 
对一维数组: 
>>> np.unique(b, return_index=True, return_inverse=True)(array([0, 1, 3, 4]), array([3, 0, 2, 1], dtype=int64), array([1, 3, 2, 0, 1, 0, 0, 1, 3, 3], dtype=int64)) 
又多返回了一个数组,可以看出这个数组是返回原各个元素在第一个矩阵array([0,1,3,4])中的位置。 
不难联想到我们常用的对数据进行数值化,关键在于它实现起来很方便。我们不妨把这个函数推广到元素为字符串的情况。 
>>> d=np.array(['s','g','w','g','s','g','w'])>>> np.unique(d)array(['g', 's', 'w'], dtype='>> np.unique(d, return_inverse=True)(array(['g', 's', 'w'], dtype=' 发现可行,这个东西是真的强大! 
不妨用来试试数值化: 
>>> feat_dic, new_d = np.unique(d, return_inverse=True)>>> feat_dicarray(['g', 's', 'w'], dtype='>> new_darray([1, 0, 2, 0, 1, 0, 2], dtype=int64)>>> feat_dic = {v: k for k, v in enumerate(feat_dic)}>>> feat_dic{'g': 0, 's': 1, 'w': 2}>>> _d = np.array([feat_dic[val] for val in d])>>> _darray([1, 0, 2, 0, 1, 0, 2]) 
可以看到直接用np.unique()生成的new_d和用feat_dic生成的_d是一致的。 
>>> np.unique(b, return_index=True, return_inverse=True, axis=-1)(array([0, 1, 3, 4]), array([3, 0, 2, 1], dtype=int64), array([1, 3, 2, 0, 1, 0, 0, 1, 3, 3], dtype=int64))>>> np.unique(c, return_index=True, return_inverse=True, axis=None)(array([0, 1, 2, 3, 4]), array([1, 0, 2, 5, 3], dtype=int64), array([1, 0, 2, 4, 1, 3, 3, 1, 1, 4, 0, 1], dtype=int64))>>> np.unique(c, return_index=True, return_inverse=True, axis=-1)(array([[0, 1, 2, 4],       [3, 1, 3, 1],       [4, 1, 0, 1]]), array([1, 0, 2, 3], dtype=int64), array([1, 0, 2, 3], dtype=int64)) 
对于一维数组,axis只能为0,-1.对于二维数组可以为0,1,-1.而且,对于一维sh数组,axis没有作用。而二维数组,aixs=1或-1.输出不同。 
return_counts=True 
>>> np.unique(b, return_counts=True)(array([0, 1, 3, 4]), array([3, 3, 1, 3], dtype=int64)) 
返回的第二个矩阵对应于第一个矩阵中元素在b中相应的出现次数。
————————————————
版权声明:本文为CSDN博主「AugustMoore」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/augustmoore/article/details/81608906

你可能感兴趣的:(python,python)