【问题标题】:How to resample an array by duplicating/skipping every N item?如何通过复制/跳过每个 N 项来重新采样数组?
【发布时间】:2019-06-15 08:40:07
【问题描述】:

我对如何实现以下目标感到困惑:

假设我有一个大小为 X 的数组(例如:3000 个项目)。我想创建一个函数,通过复制每个 N 项来将该数组拉伸到大小 Y(例如:4000)。 与另一个函数一起做相反的事情,例如删除每 N 个项目以使数组大小为 2000。

我想这更像是一个数学问题,而不是一个编程问题,正如你所知,数学不是我的强项。到目前为止,这是我所拥有的:

def upsample(originalArray, targetSize):
    newArray = []
    j = 0
    for i in range (0, len(originalArray)):
        newArray.append(originalArray[i])

        # calculate at what interval items need to be duplicated
        # this is what I'm having trouble with

        if j == interval:
            newArray.append(originalArray[i])
            j = 0

        j+=1

    return newArray

这是我正在尝试做的一个示例:

# stretch array from 10 to 12 items
originalArray = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
upsample(originalArray, 11)
# output: [0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 9]

任何帮助将不胜感激

【问题讨论】:

    标签: python numpy math scipy resampling


    【解决方案1】:

    要对数组进行下采样:

    N =2 #downsampling by 2
    new = originalArray[0:N:]
    

    上采样(aoriginaArray):

    new = [item  for t in [[a[i]]*2 if i%N==0 else [a[i],] for i in range(0,len(a))] for item in t]
    

    或更明确地说:

    res = list()
    i=0
    while(i<len(originalArray)):
         res.append(originalArray[i])
         if i%N==0:
             continue
         i +=1
    

    【讨论】:

      【解决方案2】:

      创建一个浮点 linspace 并将其映射回整数,以将其用作原始数组的索引。 (因为你想要 [0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 9] 而不是 [0, 0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 9] 你需要在 if 条件下做这个翻转的东西)。

      代码避免了性能循环。

      import numpy as np
      def upsample(originalArray, targetSize):
          x = np.linspace(0, originalArray.size, num=targetSize, endpoint=False)
          if targetSize > originalArray.size:
              x = -np.flip(x, axis=0) + originalArray.size
              x[-1] = originalArray.size - 1
          x = originalArray[x.astype(int)]
          return x
      

      upsample(originalArray, 21)[0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 9]

      upsample(originalArray, 23)[0 0 1 1 2 2 3 3 3 4 4 5 5 6 6 6 7 7 8 8 9 9 9]

      upsample(originalArray, 5)[0 2 4 6 8]

      等等

      【讨论】:

      • 非常感谢,这正是我想要的
      猜你喜欢
      • 2021-05-28
      • 1970-01-01
      • 2019-04-02
      • 2022-07-24
      • 2021-07-27
      • 1970-01-01
      • 2017-04-17
      • 2019-12-27
      • 2020-08-28
      相关资源
      最近更新 更多