我正在尝试将一维数组拉伸到任意大小而不进行插值。
例如:
>>> my_array
*[0,1,8,4]*
>>> stretch(my_array, 7)
*[0,0,1,1,8,8,4]*
或
>>> my_array
*[6,3,7,1]*
>>> stretch(my_array, 10)
*[6,6,3,3,3,7,7,7,1,1]*
等等的。
我天真的方法正是我想要的。
def interp(list, length):
out = np.zeros(length, dtype=np.uint)
for x in range(length):
out[x] = list[int(x * (len(list)/length))]
return out
然而,事实证明这是极其缓慢的;我试图每帧做几十/几百次。
interp方法对于连续函数很好用,但我也试图处理非连续数据。(如在实施例中)
numpy.repeat很接近,但只能将数组拉伸某个整数倍。
感谢阅读!
编辑:为了澄清,我想我正在尝试在一维中进行最近邻插值。
例如:
[ 5| 5| 7| 7| 7| 9| 9]
[ 5 | 7 | 9 ]
我尝试从底部数组到顶部,对于任意大小。
目标数组的每个单元格都Map到输入数组中它最近的邻居。
3条答案
按热度按时间qv7cva1a1#
确切的逻辑尚不清楚,但向量解决方案可能是使用
numpy.repeat
和切片:您可以根据需要的规则调整切片部分
bvpmtnay2#
通过公式
k * n // m
创建从0
到n-1
的m
索引列表,并使用隐式循环通过解引用初始列表生成新列表。例如
单行线:
双内衬:
如果
n
和m
是常数,则只计算一次索引。我怀疑没有人能做得更好。OpenCV的
resize
在INTER_NEAREST
模式下就是这样做的。如果在单个图像行上完成,开销可能无法承受。如果在多行上完成,可能会更快。jobtbby33#
类似于Yves方法,但使用
np.linspace
生成索引。时间
将10个元素拉伸到1,000,000是拉伸速度的40倍。