Python 两个for循环的向量化

Python 两个for循环的向量化,python,numpy,vectorization,Python,Numpy,Vectorization,我正在尝试向量化一个函数,我就快到了。剩下的就是这个 for x in range(0,img.shape[1]): for y in range(0,img.shape[0]): if w00[y,x] > 0: total[y,x] += img.item((y0[y,x], x0[y,x])) * w00[y,x] if w01[y,x] > 0:

我正在尝试向量化一个函数,我就快到了。剩下的就是这个

for x in range(0,img.shape[1]):
        for y in range(0,img.shape[0]):  

            if w00[y,x] > 0:
                total[y,x] += img.item((y0[y,x], x0[y,x])) * w00[y,x]
            if w01[y,x] > 0:
                total[y,x] += img.item((y1[y,x], x0[y,x])) * w01[y,x]
            if w10[y,x] > 0:
                total[y,x] += img.item((y0[y,x], x1[y,x])) * w10[y,x]
            if w11[y,x] > 0:
                total[y,x] += img.item((y1[y,x], x1[y,x])) * w11[y,x]
这现在看起来非常难看,因为我已经对所有其他内容进行了矢量化,并引入了这个for循环,以避免破坏代码。每次索引切换时,我都很难将这部分矢量化。来点帮助就好了


而且y1和x1只是x0+1和y0+1,这可以简化矢量化

for w, x, y in zip([w00,w01,w10,w11], [y0,y1,y0,y1], [x0,x0,x1,x1]):
    total += img[y,x] * w * (w>0)

编辑:可能需要进行一些修改。由于缺少示例数据,我无法测试代码是否正常运行。

但这不是矢量化xD,其思想不是使用for循环,而是纯粹使用数组操作。这是矢量化。关键是你不能在
range(img.shape[0])
range(img.shape[1])
上循环。我不想只使用for循环,这是我对向量化的定义。我不确定我的定义是否严格100%正确,但这就是我学习它的方式。我的两分钱,矢量化并不意味着没有for循环,没有for循环也不意味着矢量化。你可以接受也可以不接受。@sebko_iic注意,这个解决方案中的循环只迭代四次,这与你考虑的变量数量相对应。您可以将其替换为
total+=img[y0,x0]*w00*(w00>0);总+=img[y1,x0]*w01*(w01>0);总+=img[y0,x1]*w10*(w10>0);总+=img[y1,x1]*w11*(w11>0)如果您不想要循环。是否更快取决于数据,但对于任何相对较大的
img
阵列,您的双循环肯定会非常慢。