在条件下从同一个索引的另一个数组替换一个数组的某些元素的更快/更优雅的方法?

时间:2019-01-21 11:22:54

标签: python arrays performance numpy for-loop

我试图用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中实现这种功能吗?

1 个答案:

答案 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])

有帮助吗?