首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用NumPy进行快速插补

用NumPy进行快速插补
EN

Stack Overflow用户
提问于 2020-03-19 13:16:07
回答 2查看 1.2K关注 0票数 4

给定一个蒙面NumPy数组的维数,(frames, points, 2)表示frames帧的视频,在每个帧中,points (x, y)点被跟踪。

我想插值这个视频从frames帧到任何数目的帧,非常快,希望使用三次样条,但任何其他连续插值也会工作得很好。

我所实现的天真解决方案将数组拆分为两个维度数组,即(frames, points)数组、X数组和Y数组。然后,我将数组转到(points, frames)。对于每一行(单点超时),我将其映射到一个索引和值,因此数组[5, 6, --, 7]变成:

[{"x": 0, "y": 5}, {"x": 1, "y": 6}, {"x": 3, "y": 7}]

我将其提供给一个scipy.interp1d,并在我的新数组(例如,[0, 0.5, 1, 1.5, 2, 2.5, 3] )上运行,并获得一个新的x, y数组,然后将其转换回NumPy。

这个过程去除了间歇性帧的遮罩(这对我来说很好)。

当前性能:形状(9 frames, 140 points, 2)(24 frames, 140 points, 2)的小数组

seconds

  • Linear插值0.115
  • 三次插值0.112秒

注意!

这是一个蒙面数组,类似于[5, 6, --, 7]。因此,在插值中加入掩码是很重要的,这样才不会有0值(数据数组看起来像[5, 6, 0, 7]!)

下面是一个包含所需和不想要的行为的数据的玩具示例:

代码语言:javascript
运行
复制
import numpy as np
import numpy.ma as ma
from scipy.interpolate import interp1d

points = np.array([1, 2, 3, 4, 0, 6])
mask = [0, 0, 0, 0, 1, 0]
points = ma.array(points, mask=mask)
print(points)  # [1 2 3 4 -- 6]

lin = np.linspace(0, 1, 6)

# Undesired behavior
f = interp1d(lin, points, axis=0, kind='cubic')
print(f(lin))  # [1  2 3 4 -8.8817842e-16 6]

# Desired behavior
compressed_lin = [0, 0.2, 0.4, 0.6, 1]
compressed_points = np.array([1,2,3,4,6])
f = interp1d(compressed_lin, compressed_points, axis=0, kind='cubic')
print(f(lin)) # [1 2 3 4 5 6]
EN

回答 2

Stack Overflow用户

发布于 2020-03-19 15:37:55

我不确定你是否像我一样使用scipy.interpolate.interp1d,但我的电脑显示了关于662 µs的信息

代码语言:javascript
运行
复制
np.random.seed(1)
points = np.random.rand(9,140,2)

f = interp1d(np.linspace(0,1,9), points, axis=0, kind='cubic')
f(np.linspace(0,1,24))

性能(timeit -n 100):

代码语言:javascript
运行
复制
662 µs ± 111 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
票数 2
EN

Stack Overflow用户

发布于 2020-03-20 05:23:10

如果您需要它的快速,1)避免蒙面数组,2)避免interp1d。如果CubicSpline不够快,你可以在考虑到你的点是等距的情况下对你自己的三次插值进行编码。

编辑:如果您真的无法避免蒙面数组,请注意scipy.interpolate中没有任何东西是numpy.ma感知的,所以您需要进行DIY。或者,考虑做一些数据计算来填充蒙面值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60758017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档