Python 矢量化numpy例程

Python 矢量化numpy例程,python,numpy,Python,Numpy,我已经编写了下面的例程,它取两条任意曲线,扭曲它们之间的空间,使之适合两条直线。对于循环,它按列处理它,作为np。linspace不对向量AFAIK进行操作。有没有办法摆脱这个循环,一次完成整个过程 def warp(img, iris_curve, pupil_curve): height, width = img.shape[:2] iris_height = np.uint8(np.max(np.int8(iris_curve) - pupil_curve)) out = np

我已经编写了下面的例程,它取两条任意曲线,扭曲它们之间的空间,使之适合两条直线。对于循环,它按列处理它,作为
np。linspace
不对向量AFAIK进行操作。有没有办法摆脱这个循环,一次完成整个过程

def warp(img, iris_curve, pupil_curve):
  height, width = img.shape[:2]
  iris_height = np.uint8(np.max(np.int8(iris_curve) - pupil_curve))
  out = np.zeros((iris_height, width))

  for r in range(0,width):
    map_theta = np.linspace(pupil_curve[r], iris_curve[r], iris_height)
    map_theta = np.uint8(np.rint(map_theta))
    out[:, r] = img[map_theta, r]

  return np.uint8(out)

谢谢

我看这段代码的第一个想法是for循环不太可能是影响性能的最重要的因素。这段代码中有大量的数据复制(调用linspace创建一个新数组,然后将其复制回更大的输出数组中。转换到不同类型还需要复制周围的数据)。例如,您是否可以不按以下方式启动输出

np.empty((h,w),dtype=np.uint8)
此外,您真的需要显式地计算所有这些值吗?除非您引用了所有这些,否则最好只使用scipy中的2D线性插值器

如果您真的想按原样生成输出,我认为您必须用Cython或类似的语言编写一些自定义内容。

如果您查看
np.linspace
,您可以将其用作代码矢量化的指南。然后,您的循环将被以下内容替换:

steps = (iris_curve - pupil_curve) / iris_height
map_theta = np.arange(iris_height)[:, None] * steps + pupil_curve
map_theta = np.rint(map_theta).astype(np.uint8)
out = img[map_theta, np.arange(width)]

您可能需要转换输出,如果没有示例,很难调试此类代码。

谢谢,建议指出。我确实需要引用所有这些数据(它修正了随后处理的图像的几何结构),所以也许Cython就是这样。好吧,所以我证明了你所说的是正确的-我设法将循环重写为向量算法,结果证明数据复制非常慢。你知道怎么加速吗?