如何通过复制/跳过每N个项目来对数组重新采样?

时间:2019-01-21 22:39:58

标签: python numpy math scipy resampling

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

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

任何帮助将不胜感激

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

创建一个浮点linspace并将其映射回整数,以将其用作原始Array的索引。 (由于您希望使用[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]