【问题标题】:RENUMBER ELEMENTS OF 1D ARRAY重新编号一维数组的元素
【发布时间】:2021-04-04 00:55:21
【问题描述】:

我是新来的,想和大家分享一个我面临的问题

基本上我必须根据另一个数组的元素重新编号一个数组。

更多细节:

我有一个 int 数组 a

a=array([    1,     2,     3, ..., 21041, 21042, 21043])

len(a)=21043

然后,对“a”应用掩码,得到 b

b=a[mask]
b=array[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 28 32 33 34 47 54 55 62....21043]

len(b)=15717

此时我已经对这个数组进行了简单的排序:

b_renumber=array[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23....15717]

所以“b”中的数字 28 在“b_renumber”中变为 21,32 变为 22,依此类推。

现在问题是第三个数组 c

因为 c 的长度大于 b。

len(c)=46153

并且由以下给出:

c=array[ 3 4 142 633 12 19 564 497 513 54 308 177 254 532 155 3 273 28 ...21037]

所以基本上 c 是一个长度为 46153(未排序)的数组,其中的元素从 1 到 21043,以及数组 b,和 b 一样,一些数字不存在(例如 21 22 23 ...等) 即不存在 b 中也不存在 c 中的相同元素。

我想要做的是重新编号 c 的元素,以便在 c 的元素的值和 b_renumber 之间存在链接。 b中的示例我们有数字28,b_renumber中的数字变为21(从b到b_renumber,28 -> 21),我想做的是:每次遇到c中的值28时,这必须变为21,其他数字相同。

最后一点:数组仍然很小,但我必须使用更大维度的数组,所以我必须以有效的方式执行此操作,也许存在允许我执行此操作的某个包的函数。请我接受每一个建议

很抱歉帖子的长度,我希望有人可以帮助我。

提前谢谢你。

马特奥

【问题讨论】:

    标签: python arrays sorting


    【解决方案1】:

    假设 b_renum 只包含 b 中每个元素的 index+1:

    输入:

    b = [0,1,2,100]
    c = [20,50,60,100]
    

    请注意,dict.get(key, default) 如果匹配则返回键的值,否则返回默认值。

    b_renum = list(range(1,len(b)+1))
    renum_dict = dict(zip(b, b_renum))
    # slightly slower
    # renum_dict = {elem:ind for ind,elem in enumerate(b)}
    
    c_renum = [renum_dict.get(key,key) for key in c]
    
    >>> print(b_renum)
    [1, 2, 3, 4]
    
    >>> print(c_renum)
    [20, 50, 60, 3]
    

    注意c_renum 中的 100 是如何映射到 3 的。我认为对您有用的是 1) 使用 zip(),因为您知道 bb_renum 的长度相同,以及 2) 使用字典查找值 + dict.get() 技巧。列表理解也很快。

    【讨论】:

    • 非常感谢。只有一件事:我不需要对 c_renum 进行排序,然后为了很好地重新编号,你必须给 c_renum 的每个元素加 1。我的意思是在 c_renum = [renum_dict.get(key,key) for key in c] 之后,c_renum=np.array(c_renum).astype(int)+1!不过非常感谢!
    • 如果您必须添加到列表中的每个值,只需执行c_renum = [renum_dict.get(key,key)+1 for key in c]。或者也许你可以找到一个更快的 numpy 解决方案。
    • 是的,但是之后我必须转换为数组。无论如何,我正在阅读您的解释非常有趣!我要学会使用!
    • 查看编辑,有一种更快的方法来创建字典
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 2022-01-05
    • 2016-01-04
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多