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))
>>> a
array([-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为:

>>> a
array([-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))
>>> b
array([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])
>>> c
array([[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='<U1')
>>> np.unique(d, return_inverse=True)
(array(['g', 's', 'w'], dtype='<U1'), array([1, 0, 2, 0, 1, 0, 2], dtype=int64))

发现可行,这个东西是真的强大!

不妨用来试试数值化:

>>> feat_dic, new_d = np.unique(d, return_inverse=True)
>>> feat_dic
array(['g', 's', 'w'], dtype='<U1')
>>> new_d
array([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])
>>> _d
array([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中相应的出现次数。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值