如何按每 N 项 duplicating/skipping 对数组重新采样?

How to resample an array by duplicating/skipping every N item?

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

假设我有一个大小为 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]

任何帮助将不胜感激

对数组进行下采样:

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

创建一个浮点 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]

等等