我对如何实现以下目标感到困惑:
假设我有一个大小为 X 的数组(例如:3000 个项目)。我想创建一个函数,通过复制每 N 个项目来将该数组拉伸(stretch)到大小 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]
任何帮助将不胜感激
最佳答案
创建一个浮点 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]
等等
关于python - 如何通过复制/跳过每 N 个项目来重新采样数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54298745/