1.引言

在本文中,我将展示一些在Python中常用的处理数组的简单而强大的技术。
这些技巧都是通过使用Numpy库进行实现的。
闲话少说,我们直接开始吧。 :)

2. 举个栗子

举例,如下所示,我们有这样一个7X7的矩阵:

假设我们需要将 7x7 数组中以绿色突出显示的部分替换为另一个 2x4 数组,效果如下:

3. 简单实现

首先,我们先将问题用程序的方式描述出来,代码如下:

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即可完成上述工作。

4. 使用mask进行条件替换

现在,假设我们需要做同样的替换,但是有一个条件。仅应替换数组 a 中与数组 b 中的数字 5 重叠的那些值,如下所示:

4.1.生成布尔型mask

我们可以借助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]]

4.2.获取感兴趣的值

我们可以在布尔型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]]

4.3.完成条件替换

有了上述准备工作,我们接着来实现我们的条件替换吧。。。

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就可以实现按照条件替换数组中的元素。

5. 实际应用

接着,我们将上述所描述的技术应用​​于图像。举例我们有两张图片(背景和一杯咖啡),如下所示:

接着我们可以将coffee的图像添加到背景图,如下所示:


当然,我们也可以使用布尔型mask操作来将两幅图做进一步的融合,如下所示:

6. 总结

本文详细介绍了在Python中使用Numpy将数组元素进行替换的操作,同时将其进行扩展到图像领域,实现了不同的图像融合效果。

您学废了吗?


关注公众号《AI算法之道》,获取更多AI算法资讯。

参考

在Numpy中用一个二维数组替换部分二维数组相关推荐

  1. php遍历数组替换内容,PHP使用数组依次替换字符串中匹配项

    先来看个sql语句: 想把上面这句sql的中括号表示的日期依次换成下面的数组中的元素array('2015-07-01','2015-07-15'); 用正则匹配:找到第一个中括号部分,用第一个元素替 ...

  2. Numpy 生成 Bool型数组、一维转多维数组reshape、多维转一维数组、替换数组元素、提取数组元素、数组交集、差集、过滤数组元素、二维数组反转行、交换数组维度

    1. 创建一个 [3,5] 所有元素为 True 的数组 In [162]: b = np.ones((3,5), dtype=bool)In [163]: b Out[163]: array([[ ...

  3. 求一个二维数组外围元素之和_C++数组作为函数的参数(学习笔记:第6章 04)...

    数组作为函数的参数[1] 数组元素作实参,与单个变量一样. 数组名作参数,形.实参数都应是数组名(实质上是地址,关于地址详见后续章节),类型要一样,传送的是数组首地址.对形参数组的改变会直接影响到实参 ...

  4. Algs4-1.1.13编写一段代码,打印出一个M行N列的二维数组的转置(交换行和列)

    1.1.13编写一段代码,打印出一个M行N列的二维数组的转置(交换行和列). public  class Test {     public static void main(String[] arg ...

  5. m行n列最大值和最小值C语言,找数组最值 按如下函数原型编程从键盘输入一个m行n列的二维数...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 找数组最值 按如下函数原型编程从键盘输入一个m行n列的二维数组,然后计算数组中元素的最大值及其所在的行列下标值.其中,m和n的值由用户键盘输入.已知m和n ...

  6. C语言试题二十三之编写一个函数void function(int tt[m][n],int pp[n]),tt指向一个m行n列的二维函数组,求出二维函数组每列中最小元素,并依次放入pp所指定一维数组中

    1. 题目 请编写一个函数void function(int tt[m][n],int pp[n]),tt指向一个m行n列的二维函数组,求出二维函数组每列中最小元素,并依次放入pp所指定一维数组中.二 ...

  7. python二维数组排序_Python实现二维数组按照某行或列排序的方法【numpy lexsort】...

    本文实例讲述了Python实现二维数组按照某行或列排序的方法.分享给大家供大家参考,具体如下: lexsort支持对数组按指定行或列的顺序排序:是间接排序,lexsort不修改原数组,返回索引. (对 ...

  8. PHP如何判断一个数组是一维数组或者是二维数组?用什么函数?

    如题:如何判断一个数组是一维数组或者是二维数组?用什么函数? 判断数量即可 <?php if (count($array) == count($array, 1)) {echo '是一维数组'; ...

  9. 在主方法中定义一个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’;输出这个数组中的所有元素。...

    //在主方法中定义一个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是'*',其余 位置存的是'#':输出这个数组中的所有元素.char [][]y=new char [10][10] ...

最新文章

  1. 【codeforces 508B】Anton and currency you all know
  2. 第四次团队作业——系统设计
  3. ubuntu多版本python和pip切换
  4. 制作.sens数据集跑通bundlefusion
  5. (八)Spring与MyBatis整合
  6. 前端学习(3042):vue+element今日头条管理-用户退出
  7. 学无止境,我还在进步
  8. Catch That Cow抓住那只奶牛(BFS,广度优先搜索)
  9. VDN For PB Web实现消息推送
  10. 5款App帮你创建时间轴
  11. 【二次开发应用】安信可ESP32/ESP8266模组入网阿里生活物联网平台
  12. JPSE问题诊断指导四——hprof
  13. unity sky Time of Day - Dynamic Sky Dome
  14. python--webdriver驱动浏览器操作(基础知识)
  15. 用Beamer做slides-模板
  16. npm install 报错:found XXX vulnerabilities (XXX low, X moderate),run `npm audit fix` to fix them, or `
  17. Python实现——依次计算一系列给定字符串的字母值,字母值为字符串中每个字母对应的编号值(A对应1,B对应2,以此类推,不区分大小写字母,非字母字符对应的值为0)的总和。
  18. linux 动画软件,免费开源的 2D 动画软件
  19. 植物大战僵尸内存地址(转)
  20. 【字节日常实习-前端凉经】

热门文章

  1. CSDN注销账号、解绑手机、邮箱问题(已解决)
  2. uCOS2源码分析3-RTOS核心代码视频课程-第4季第4部分-朱有鹏-专题视频课程
  3. R语言dplyr包group_by函数、summarise函数、where函数和across函数计算dataframe数据中所有的数值数据列的均值、across函数对多个列执行相同的操作
  4. 使用策略模式的设计方式来实现对数组的排序,提供两种具体的实施策略,冒泡排序法和选择排序法
  5. python实现将json字幕转srt
  6. 【MySQL进阶】多表连接的原理
  7. 《心动的信号4》收官,珍爱网红娘解读爱情观
  8. 大学生怎样学好java
  9. vue+element表格的左右布局及动态添加行
  10. Matlab求解非线性规划(fmincon函数的使用)