我对如何实现以下目标感到困惑:
说我有一个大小为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]
任何帮助将不胜感激
答案 0 :(得分:1)
要对数组降采样:
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
答案 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]
等