【发布时间】:2021-07-14 09:10:56
【问题描述】:
我了解矢量化的概念,以及当您想调整每个单独的元素时如何避免使用循环遍历元素,但是当我们有条件时我不知道如何做到这一点基于像素的相邻值。
例如,如果我有一个面具:
mask = np.array([[0,0,0,0],
[1,0,0,0],
[0,0,0,1],
[1,0,0,0]])
我想通过评估掩码中的相邻组件来更改元素,如下所示:
if sum(mask[j-1:j+2,i-1:i+2].flatten())>1 and mask[j,i]!=1:
out[j,i]=1
当我特别需要访问相邻元素时如何向量化操作?
提前致谢。
完整循环:
import numpy as np
mask = np.array([[0,0,0,0], [1,0,0,0], [0,0,0,1], [1,0,0,0]])
out = np.zeros(mask.shape)
for j in range(len(mask)):
for i in range(len(mask[0])):
if sum(mask[j-1:j+2,i-1:i+2].flatten())>1 and mask[j,i]!=1:
out[j,i]=1
输出:
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 1. 0. 0.]
[0. 0. 0. 0.]]
【问题讨论】:
-
你确定你的索引吗?如果 i == 0,则 i-1 = -1。负索引不会给你一个邻域元素。
-
顺便说一句,
sum(mask[j-1:j+2,i-1:i+2].flatten())>1应该只是mask[j-1:j+2,i-1:i+2].sum() > 1 -
@Corralien 是的,在实际工作中我没有考虑边缘效应,但是你是正确的,使用 -1 索引将返回数组另一端的元素。
-
我认为
mask[j,i]!=1没用。如果为1,则out[j,i]的值已经为1,如果不设置out[j,i]为1。最后如果sum(mask[j-1:j+2,i-1:i+2].flatten())>1,out[j,i]应该为1。所以只有第一个条件就足够了。 -
@Corralien 这不是真的,因为如果您将所有 1 的掩码图像化,那么输出中的每个值也将是一个,而没有这种条件的实现。
标签: python numpy vectorization