【问题标题】:Rearrange array element based on the number sequence and represent by array id根据数列重新排列数组元素并用数组id表示
【发布时间】:2021-04-26 05:40:56
【问题描述】:

假设,我在一个数组中有多个数组,数字从 0 到 n 以多顺序排列。 例如,

x = [[0,2,3,5],[1,4]]

这里我们在 x 中有两个数组。可能不止两个。

我想根据它们的编号顺序重新排列所有数组元素。但是,它们将代表它们的阵列 ID。结果应该是这样的

y = [0,1,0,0,1,0]

这意味着 0,2,3,5 在数组 id 0 中。因此,它们将按各自的顺序显示 id。 1 和 4 相同。谁能帮我解决这个问题? [注:可能有两个以上的数组。因此,如果代码适用于不同的数组编号,将不胜感激]

【问题讨论】:

    标签: python arrays numpy sorting


    【解决方案1】:
    1. 您可以使用dictionary 来执行此操作
    x = [[0,2,3,5],[1,4]]
    lst = {}
    for i in range(len(x)):
        for j in range(len(x[i])):
            lst[x[i][j]] = i
    print(lst)
    
    1. 您也可以使用list 来执行此操作,list.insert(idx, value) 表示value 被插入到idxth 索引处的列表中。在这里,我们遍历了x的所有值,x[i][j]的值在i这个数字数组中。
    x = [[0,2,3,5],[1,4]]
    lst = []
    for i in range(len(x)):
        for j in range(len(x[i])):
            lst.insert(x[i][j], i)
    print(lst)
    

    输出:[0, 1, 0, 0, 1, 0]

    【讨论】:

    • @Lzz0 我希望你明白了
    • 在列表上使用插入是一个O(n) 操作,因为插入索引之后的所有值每次都需要在内存中向下移动,因此对于大列表来说是不好的。因此,我认为您应该将您的字典解决方案作为第一个,因为它对 OP 更有效。
    • @ShashSinha 感谢您的评论,已更新。
    【解决方案2】:

    您也可以考虑使用np.argsort 重新排列您的数组值并使用列表理解创建索引数组:

    x = [[0,2,3,5],[1,4]]
    order = np.concatenate(x).argsort()
    np.concatenate([ [i]*len(e) for i,e in enumerate(x) ])[order]
    

    数组([0, 1, 0, 0, 1, 0])

    【讨论】:

      猜你喜欢
      • 2016-07-26
      • 2012-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-21
      相关资源
      最近更新 更多