Как пересчитать массив, дублируя / пропуская каждый элемент N? - PullRequest
0 голосов
/ 22 января 2019

Я не понимаю, как добиться следующего:

Скажем, у меня есть массив размера X (например, 3000 элементов).Я хочу создать функцию, которая будет растягивать этот массив до размера Y (например, 4000) путем дублирования каждого элемента N.Наряду с другой функцией, выполняющей обратное, удалите все 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 голосов
/ 22 января 2019

Создайте 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]

и т.д.

0 голосов
/ 22 января 2019

Чтобы уменьшить массив:

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

Для увеличения (a означает originaArray):

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
...