首先,它不应该花费 6 秒。在 160x120 图像上尝试您的代码对我来说大约需要 0.2 秒。
也就是说,为了获得良好的numpy
性能,您通常希望避免循环。有时沿除最小轴外的所有轴进行矢量化并沿该轴循环会更简单,但如果可能,您应该尝试一次完成所有操作。这通常会使事情变得更快(将循环向下推到 C)和更容易。
你的 for 循环本身对我来说似乎有点奇怪——你似乎在开始存储结果的位置(你的第一个值放在z=1
,而不是z=0
)和如何您正在寻找的距离(range(0, x-1)
不包括x-1
,因此您缺少最后一行/列-可能是您想要range(x)
的。)
如果您想要的只是索引 wherer > 120
但既不是g > 100
nor b > 100
,还有更简单的方法。我们可以创建布尔数组。例如,首先我们可以制作一些虚拟数据:
>>> r = np.random.randint(0, 255, size=(8,8))
>>> g = np.random.randint(0, 255, size=(8,8))
>>> b = np.random.randint(0, 255, size=(8,8))
然后我们可以找到满足我们条件的地方:
>>> (r > 120) & ~(g > 100) & ~(b > 100)
array([[False, True, False, False, False, False, False, False],
[False, False, True, False, False, False, False, False],
[False, True, False, False, False, False, False, False],
[False, False, False, True, False, True, False, False],
[False, False, False, False, False, False, False, False],
[False, True, False, False, False, False, False, False],
[False, False, False, False, False, False, False, False],
[False, False, False, False, False, False, False, False]], dtype=bool)
然后我们可以np.where
用来获取坐标:
>>> r_idx, c_idx = np.where((r > 120) & ~(g > 100) & ~(b > 100))
>>> r_idx
array([0, 1, 2, 3, 3, 5])
>>> c_idx
array([1, 2, 1, 3, 5, 1])
我们可以通过索引回 、 和 来对这些进行健全r
性g
检查b
:
>>> r[r_idx, c_idx]
array([166, 175, 155, 150, 241, 222])
>>> g[r_idx, c_idx]
array([ 6, 29, 19, 62, 85, 31])
>>> b[r_idx, c_idx]
array([67, 97, 30, 4, 50, 71])