gpt4 book ai didi

python - 如何用指定列表的索引替换数组的所有项目?

转载 作者:行者123 更新时间:2023-12-03 23:04:17 25 4
gpt4 key购买 nike

我要替换sequence的所有项目id 告诉他们在哪个标签列表中。假设所有的值在 sequence 中都是不同的和 labellerlabeller 列表的并集与 sequence 有相同的项目. lsizes对应于 labeller 中列表的大小并且对于 Pythonic 解决方案是多余的,但对于完全矢量化的解决方案可能是强制性的。

sequence = [1, 2, 10, 5, 6, 4, 3, 8, 7, 9],
labeller = [[1, 2, 10], [3, 4, 5, 6, 7], [8, 9]]
lsizes = [3, 5, 2]
我知道如何以简单的方式解决它:
idx = {u:i for i, label in enumerate(labeller) for u in label}
tags = [idx[u] for u in sequence]
输出是:
tags = [0, 0, 0, 1, 1, 1, 1, 2, 1, 2]
在那之后,我全力以赴地以矢量化的方式来做到这一点。这对我来说相当复杂。这是我的尝试,而不是猜测,但不幸的是,它没有通过我的所有测试。我希望我很接近:
sequence = np.array(sequence)
cl = np.concatenate(labeller)
_, cl_idx = np.unique(cl, return_index=True)
_, idx = np.unique(sequence[cl_idx], return_index=True)
tags = np.repeat(np.arange(len(lsizes)), lsizes)[idx]
#output: [0 0 1 1 0 1 1 1 2 2]
我怎样才能完成它?我还想看到严格的解释它的作用以及如何更好地理解它。也欢迎任何来源。

最佳答案

方法#1
对于那些追溯问题, searchsorted 似乎也是在这里工作的方法,重新使用您的 cl ——

cl = np.concatenate(labeller)
sidx = cl.argsort()
idx = np.searchsorted(cl, sequence, sorter=sidx)
idx0 = sidx[idx]

l = list(map(len, labeller))
r = np.repeat(np.arange(len(l)), l)
out = r[idx0]
使用 lsizesl使其完全矢量化。但是,我怀疑连接步骤可能很重。这是否值得在很大程度上取决于子数组的长度。
方法#2
对于正数,这里有一个数组索引作为散列机制 -
N = max(map(max, labeller))+1
id_ar = np.zeros(N, dtype=int) # use np.empty for perf. boost
for i,l in enumerate(labeller):
id_ar[l] = i
out = id_ar[sequence]

关于python - 如何用指定列表的索引替换数组的所有项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63623869/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com