在本文中,我将展示一些在Python中常用的处理数组的简单而强大的技术。
这些技巧都是通过使用Numpy库进行实现的。
闲话少说,我们直接开始吧。 :)
举例,如下所示,我们有这样一个7X7的矩阵:
假设我们需要将 7x7 数组中以绿色突出显示的部分替换为另一个 2x4 数组,效果如下:
首先,我们先将问题用程序的方式描述出来,代码如下:
import numpy as np
a = np.array([[1,1,1,1,1,1,1],
[1,4,4,4,1,1,1],
[1,4,4,4,1,1,1],
[1,4,4,4,1,1,1],
[1,4,4,4,1,1,1],
[1,4,4,4,1,1,1],
[1,1,1,1,1,1,1]])
a_copy = a.copy()
b = np.array([[8,5,5,8],
[8,5,5,8]])
print("Array a:")
print(a)
print("\nCopy of array a:")
print(a_copy)
print("\nArray b:")
print(b)
输出如下:
Array a:
[[1 1 1 1 1 1 1]
[1 4 4 4 1 1 1]
[1 4 4 4 1 1 1]
[1 4 4 4 1 1 1]
[1 4 4 4 1 1 1]
[1 4 4 4 1 1 1]
[1 1 1 1 1 1 1]]
Copy of array a:
[[1 1 1 1 1 1 1]
[1 4 4 4 1 1 1]
[1 4 4 4 1 1 1]
[1 4 4 4 1 1 1]
[1 4 4 4 1 1 1]
[1 4 4 4 1 1 1]
[1 1 1 1 1 1 1]]
Array b:
[[8 5 5 8]
[8 5 5 8]]
上述代码中,我们将数组a进行了拷贝,同时声明了需要替换的2X4的数组b.接着,我们使用以下代码将数组b替换数组a中第4行和第5行以及第3,4,5,6列的元素:
a[3:5,2:6] = b
print("Array a after being partially replaced with array b:")
print(a)
输出如下:
Array a after being partially replaced with array b:
[[1 1 1 1 1 1 1]
[1 4 4 4 1 1 1]
[1 4 4 4 1 1 1]
[1 4 8 5 5 8 1]
[1 4 8 5 5 8 1]
[1 4 4 4 1 1 1]
[1 1 1 1 1 1 1]]
哇偶,相当简单,仅仅使用a[3:5,2:6] = b
即可完成上述工作。
现在,假设我们需要做同样的替换,但是有一个条件。仅应替换数组 a 中与数组 b 中的数字 5 重叠的那些值,如下所示:
我们可以借助mask来实现上述功能。布尔型的mask,可以通过b_mask_boolean = b == 5.
直接获得,样例代码如下:
b_mask_boolean = b == 5
print("Boolean mask for numbers equal to 5 in array b:")
print(b_mask_boolean)
输出如下:
Boolean mask for numbers equal to 5 in array b:
[[False True True False]
[False True True False]]
我们可以在布尔型mask的辅助下做一些很有趣的事情。例如,将我们不感兴趣的数组元素赋值为零,反之亦然。举例如下:
print("\nArray b multiplied by boolean mask:")
print(b * b_mask_boolean)
print("\nArray b multiplied by inversed boolean mask:")
print(b * ~b_mask_boolean)
print("\nPart of array a (4th and 5th rows; 3rd, 4th, 5th and 6th columns) multiplied by boolean mask:")
print(a_copy[3:5,2:6] * b_mask_boolean)
print("\nPart of array a (4th and 5th rows; 3rd, 4th, 5th and 6th columns) multiplied by inversed boolean mask:")
print(a_copy[3:5,2:6] * ~b_mask_boolean)
输出如下:
Array b multiplied by boolean mask:
[[0 5 5 0]
[0 5 5 0]]
Array b multiplied by inversed boolean mask:
[[8 0 0 8]
[8 0 0 8]]
Part of array a (4th and 5th rows; 3rd, 4th, 5th and 6th columns) multiplied by boolean mask:
[[0 4 1 0]
[0 4 1 0]]
Part of array a (4th and 5th rows; 3rd, 4th, 5th and 6th columns) multiplied by inversed boolean mask:
[[4 0 0 1]
[4 0 0 1]]
有了上述准备工作,我们接着来实现我们的条件替换吧。。。
a_copy[3:5,2:6] = a_copy[3:5,2:6] * ~b_mask_boolean + b * b_mask_boolean
print("\nArray a after being partially replaced with array b (with numbers 5 from array b only):")
print(a_copy)
输出如下:
Array a after being partly replaced with array b (with numbers 5 from array b only):
[[1 1 1 1 1 1 1]
[1 4 4 4 1 1 1]
[1 4 4 4 1 1 1]
[1 4 4 5 5 1 1]
[1 4 4 5 5 1 1]
[1 4 4 4 1 1 1]
[1 1 1 1 1 1 1]]
这里值得一提的是,我们将以下两个数组进行了相加,即:
[[4 0 0 1]
[4 0 0 1]]
和数组
[[0 5 5 0]
[0 5 5 0]]
相加后得到数组:
[[4 5 5 1]
[4 5 5 1]]
接着我们使用该数组的元素将a中对应的元素进行了替换。
总结一下下,就是我们可以使用语句a_copy[3:5,2:6] = a_copy[3:5,2:6] * ~b_mask_boolean + b * b_mask_boolean
就可以实现按照条件替换数组中的元素。
接着,我们将上述所描述的技术应用于图像。举例我们有两张图片(背景和一杯咖啡),如下所示:
接着我们可以将coffee的图像添加到背景图,如下所示:
当然,我们也可以使用布尔型mask操作来将两幅图做进一步的融合,如下所示:
本文详细介绍了在Python中使用Numpy将数组元素进行替换的操作,同时将其进行扩展到图像领域,实现了不同的图像融合效果。
您学废了吗?
关注公众号《AI算法之道》,获取更多AI算法资讯。
参考