确认NumPy中np.unique(return_index=True)返回索引是否始终为自然顺序
NumPy中np.unique(return_index=True)的索引规则确认
是的,np.unique(a, return_index=True)返回的索引始终对应各唯一元素在原数组中的首次出现位置,这是NumPy明确规定的行为,并非偶然结果。具体细节分两种情况:
默认排序(sort=True)
默认情况下,np.unique会先对原数组的唯一元素进行升序排序,再返回每个排序后元素在原数组里第一次出现的索引。比如你给出的示例:
import numpy as np a = np.array(['a', 'b', 'b', 'c', 'a']) u, indices = np.unique(a, return_index=True)
输出结果:
u = array(['a', 'b', 'c'], dtype='<U1') indices = array([0, 1, 3])
这里u是升序排列的唯一元素,indices分别对应'a'(原数组索引0)、'b'(原数组索引1)、'c'(原数组索引3)的首次出现位置。
关闭排序(sort=False)
如果设置sort=False,唯一元素会按照它们在原数组中首次出现的顺序返回,此时返回的索引依然是这些元素的首次出现位置。比如修改示例中的参数:
u, indices = np.unique(a, return_index=True, sort=False)
输出结果和默认情况一致(因为原数组首次出现顺序刚好是升序):
u = array(['a', 'b', 'c'], dtype='<U1') indices = array([0, 1, 3])
换一个首次出现顺序非升序的数组测试:
a = np.array(['c', 'a', 'b', 'a', 'c']) u, indices = np.unique(a, return_index=True, sort=False)
输出:
u = array(['c', 'a', 'b'], dtype='<U1') indices = array([0, 1, 2])
可以看到u按原数组首次出现的c、a、b排序,indices对应它们的首次出现索引。
总结:无论是否开启排序,return_index=True返回的索引都是各唯一元素在原数组中的首次出现位置,唯一元素的排序方式由sort参数决定,但索引的规则是固定的。
内容的提问来源于stack exchange,提问作者Alexander Chervov
相关产品推荐
相关产品推荐

