我试图用Numpy函数替换for-loop以加快程序运行速度。下面的函数使每个标签的范围增大(背景标签= 0)。
标签区域不会侵蚀其他区域。因此,我创建了一个双for循环,以检查是否将某些标签替换为另一个标签。如果是这样,请回滚到原始地图。
但是,这些for循环使过程变慢。
Python支持如下语法:array1 [condition] = x。 我想知道x是否可以是array1的相同索引处的array2的值?
还是有一些NumPy函数可以完成这项工作?
nb_components, mask, sizes, centroids = cv2.connectedComponentsWithStats(image, connectivity=8)
nb_components-=1; sizes=sizes[1:,-1]; centroids=centroids[1:,:]
new = np.zeros((mask.shape))
for i in range(10):
new = ndimage.maximum_filter(mask, 3)
for i in range(mask.shape[0]):
for j in range(mask.shape[1]):
if (mask[i][j]>0) and (new[i][j]>0) and (mask[i][j]!=new[i][j]):
new[i][j]=mask[i][j]
mask=np.copy(new)
#imshow(skimage.color.label2rgb(new, bg_label=0))
#plt.show()
return new
编辑 我英语不好,可能会引起误解。 这是一个例子。 如果索引是奇数,则将a [index]替换为b [index]
a:(1,6,5,4,3) b:(2,7,9,9,6)
所以将6,4替换为7,9
我可以在不带for循环的python中实现这种功能吗?
答案 0 :(得分:0)
考虑问题的这一部分“我想知道x是否可以是array1的相同索引处的array2的值?”
在numpy中有整数数组索引[https://docs.scipy.org/doc/numpy-1.15.1/reference/arrays.indexing.html]。
import numpy as np
a=np.array([4 ,0 ,5 ,3 ,2 ,2 ,0 ])
b=np.array([5, 17, 29, 38, 45, 52 ])
b[a]
Out[9]: array([45, 5, 52, 38, 29, 29, 5])
有帮助吗?