【问题标题】:Renumber a sequence to remove gaps, but keep identical numbers重新编号序列以消除间隙,但保持相同的数字
【发布时间】:2020-06-03 17:50:13
【问题描述】:

假设一个无序列表的数字,允许重复。我想修补其中的所有间隙或突然跳跃。一些例子:

def renum(arr):
    # magic happens here
    pass

renum(np.array([1, 1, 1, 2, 2, 2]))  # already in correct shape
> [1, 1, 1, 2, 2, 2]

renum(np.array([1, 1, 2, 2, 4, 4, 5, 5, 5]))  # A jump between 2 and 4
> [1,1, 2, 2, 3, 3, 4, 4, 4]

renum(np.array([1, 1, 2, 2, 5, 2, 2]))  # A forward and backward jump
> [1,1, 2, 2, 3, 4, 4]

查找间隙很容易,但是在按元素处理序列时,我很难尝试对间隙重新编号,然后多次重复相同的数字。即下面的尝试失败,因为数字可能出现多次:

def renum(arr):
    new_arr = np.zeros(len(arr))
    prev_num = new_arr[0]
    for idx, num in enumerate(arr):
        diff = num - prev_num
        if diff == 0 or diff == 1:
            new_arr[idx] = num
        else:
            new_arr[idx] = prev_num + 1
        prev_num = new_arr[idx]
    return new_arr

renum(np.array([1, 1, 2, 2, 4, 4, 5, 5, 5]))
> [1, 1, 2, 2, 3, 4, 5, 5, 5]  # should actually be [1, 1, 2, 2, 3, 3, 4, 4, 4]

另外我认为这个实现不是很有效.. 有什么想法吗?

【问题讨论】:

    标签: python list numpy


    【解决方案1】:

    这似乎可以解决问题:

    def renum(input_array):
        diff = np.diff(input_array)
        diff[diff != 0] = 1
        return np.hstack((input_array[0], diff)).cumsum()
    

    如果我理解正确,您希望您的值之间的差异为 0,如果它们在原始数组中为 0。如果它们不为零,您希望它们为 1。这发生在前两行。现在,您可以使用第一个原始元素和新创建的差异来创建一个新数组,如here 所述。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-17
      • 1970-01-01
      • 1970-01-01
      • 2011-03-05
      • 1970-01-01
      • 1970-01-01
      • 2012-06-19
      相关资源
      最近更新 更多