Numpy矢量化

Sur*_*bra 3 python numpy vectorization

如何numpy vectorize以下python代码(for循环)?任何帮助都感激不尽

arr1 = np.ndarray(shape = (184,184))
arr2 = np.ndarray(shape = (184,184))
arr3 = np.full((184, 184), 0.0, dtype=float)
for i in range(arr1.size[0]):
    for j in range(arr1.size[1]):
        if arr2[i,j] == 0 or arr1[i,j] == 0:
            arr3[i,j]=0
        elif arr2[i,j] == 255 and arr1[i,j] == 255:
            arr3[i, j] = 255
Run Code Online (Sandbox Code Playgroud)

Div*_*kar 5

利用矢量化操作masks and boolean-indexing-

mask1 = (arr1==0) | (arr2==0)
mask2 = (arr1==255) & (arr2==255)

arr3[mask1] = 0
arr3[mask2] = 255
Run Code Online (Sandbox Code Playgroud)

如果arr3已经初始化了zeros,我们可以跳过该arr3[mask1]部分,因为zeros无论如何分配,因为没有其他条件语句,我们可以直接arr3使用mask2,就像这样 -

arr3 = 255.0*mask2
Run Code Online (Sandbox Code Playgroud)

样品运行验证 -

In [23]: # Setup input
    ...: np.random.seed(0)
    ...: arr1 = (np.random.rand(184,184)>0.5)*255
    ...: arr2 = (np.random.rand(184,184)>0.5)*255

In [24]: # Run original code
    ...: arr3 = np.full((184, 184), 0.0, dtype=float)
    ...: for i in range(arr1.shape[0]):
    ...:     for j in range(arr1.shape[1]):
    ...:         if arr2[i,j] == 0 or arr1[i,j] == 0:
    ...:             arr3[i,j]=0
    ...:         elif arr2[i,j] == 255 and arr1[i,j] == 255:
    ...:             arr3[i, j] = 255

In [25]: # Run proposed code#1
    ...: out = np.full((184, 184), 0.0, dtype=float)
    ...: mask1 = (arr1==0) | (arr2==0)
    ...: mask2 = (arr1==255) & (arr2==255)
    ...: 
    ...: out[mask1] = 0
    ...: out[mask2] = 255

In [26]: np.allclose(arr3, out) #verify code#1
Out[26]: True

In [27]: np.allclose(arr3, 255.0*mask2) #verify code#2
Out[27]: True
Run Code Online (Sandbox Code Playgroud)