【问题标题】:Vectorization of two for-loops两个 for 循环的向量化
【发布时间】:2020-10-20 20:58:11
【问题描述】:

我正在尝试对一个函数进行矢量化,而且我快到了。剩下的就是这个

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,这样可以简化向量化

【问题讨论】:

    标签: python numpy vectorization


    【解决方案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); total += img[y1, x0] * w01 * (w01>0); total += img[y0, x1] * w10 * (w10>0); total += img[y1, x1] * w11 * (w11>0); 替换它。是否更快取决于数据,但对于任何相对较大的img 数组,您的双循环肯定会非常慢。
    猜你喜欢
    • 2014-03-15
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多