numpy unique,对数组的唯一元素进行自定义排序

s6fujrry  于 12个月前  发布在  其他
关注(0)|答案(3)|浏览(103)

给出:

R=["ip1", "ip7", "ip12", "ip5", "ip2", "ip22", "ip7", "ip1", "ip17", "ip22"]

字符串
我想得到我的列表R的唯一值及其相应的索引。
现在,我有name,idx=np.unique(R,return_inverse=True)返回:

array(['ip1', 'ip12', 'ip17', 'ip2', 'ip22', 'ip5', 'ip7'], dtype='<U4') # name
[0 6 1 5 3 4 6 0 2 4]                                                    # idx


但我想使用自定义排序,结果如下:

['ip1', 'ip2', 'ip5', 'ip7', 'ip12', 'ip17', 'ip22']
[0 3 4 2 1 6 3 0 5 6]


list中,我可以将Rs=sorted(R, key=lambda x: int(x[2:]))与自定义的key一起使用,但我无法获得唯一值和相应的索引。
有没有什么方法可以操作排序键np.unique,或者已经有更好的方法来处理这个问题?

rur96b6h

rur96b6h1#

转换为int后运行unique

_, i, idx = np.unique([int(x[2:]) for x in R],
                      return_index=True,
                      return_inverse=True)

names = np.array(R)[i]

字符串
产出:

# names
array(['ip1', 'ip2', 'ip5', 'ip7', 'ip12', 'ip17', 'ip22'], dtype='<U4')

# idx
array([0, 3, 4, 2, 1, 6, 3, 0, 5, 6])

ki0zmccv

ki0zmccv2#

在代码中做修改后。我得到了想要的输出。

import numpy as np

R = ["ip1", "ip7", "ip12", "ip5", "ip2", "ip22", "ip7", "ip1", "ip17", "ip22"]
unique_values, indices = np.unique(R, return_inverse=True)
def custom_sort_key(value):
    return int(value[2:])

sorted_indices = np.argsort([custom_sort_key(value) for value in unique_values])
sorted_unique_values = unique_values[sorted_indices]
sorted_indices = np.argsort(sorted_indices)
print(sorted_unique_values)
print(sorted_indices)

字符串
输出量:

['ip1' 'ip2' 'ip5' 'ip7' 'ip12' 'ip17' 'ip22']
[0 4 5 1 6 2 3]

nwwlzxa7

nwwlzxa73#

由于你已经在使用numpy了,你可能会发现使用numpy将字符串转换为整数比在python中循环遍历列表更快。
首先,让我们将R定义为np.ndarray

>>> R=np.array(["ip1", "ip7", "ip12", "ip5", "ip2", "ip22", "ip7", "ip1", "ip17", "ip22"])

字符串
我们可以将其拆分为一个2d字符数组,如下所示:

>>> R_chars = R.view('U1').reshape((len(R), -1))

array([['i', 'p', '1', ''],
       ['i', 'p', '7', ''],
       ['i', 'p', '1', '2'],
       ['i', 'p', '5', ''],
       ['i', 'p', '2', ''],
       ['i', 'p', '2', '2'],
       ['i', 'p', '7', ''],
       ['i', 'p', '1', ''],
       ['i', 'p', '1', '7'],
       ['i', 'p', '2', '2']], dtype='<U1')


然后,切出前两个字符:

>>> R_sliced = R_chars[:, 2:]
array([['1', ''],
       ['7', ''],
       ['1', '2'],
       ['5', ''],
       ['2', ''],
       ['2', '2'],
       ['7', ''],
       ['1', ''],
       ['1', '7'],
       ['2', '2']], dtype='<U1')


并合并组合切片数组的字符:

>>> new_dtype_size = R_sliced.shape[1] 

2

>>> new_dtype = f"U{new_dtype_size}"

'U2'

>>> R_ints = R_sliced.view(new_dtype).astype(int).squeeze()

array([ 1,  7, 12,  5,  2, 22,  7,  1, 17, 22])


现在你已经有了所有的整数,你可以在R_ints上使用np.unique来获得排序的唯一元素的索引:

>>> _, i, idx = np.unique(R_ints, return_index=True, return_inverse=True)

array([0, 4, 3, 1, 2, 8, 5], dtype=int64)


最后创建names作为R[i]

>>> names = R[i]

array(['ip1', 'ip2', 'ip5', 'ip7', 'ip12', 'ip17', 'ip22'], dtype='<U4')

相关问题