在Numpy中用一个二维数组替换部分二维数组
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中用一个二维数组替换部分二维数组相关推荐
- php遍历数组替换内容,PHP使用数组依次替换字符串中匹配项
先来看个sql语句: 想把上面这句sql的中括号表示的日期依次换成下面的数组中的元素array('2015-07-01','2015-07-15'); 用正则匹配:找到第一个中括号部分,用第一个元素替 ...
- Numpy 生成 Bool型数组、一维转多维数组reshape、多维转一维数组、替换数组元素、提取数组元素、数组交集、差集、过滤数组元素、二维数组反转行、交换数组维度
1. 创建一个 [3,5] 所有元素为 True 的数组 In [162]: b = np.ones((3,5), dtype=bool)In [163]: b Out[163]: array([[ ...
- 求一个二维数组外围元素之和_C++数组作为函数的参数(学习笔记:第6章 04)...
数组作为函数的参数[1] 数组元素作实参,与单个变量一样. 数组名作参数,形.实参数都应是数组名(实质上是地址,关于地址详见后续章节),类型要一样,传送的是数组首地址.对形参数组的改变会直接影响到实参 ...
- Algs4-1.1.13编写一段代码,打印出一个M行N列的二维数组的转置(交换行和列)
1.1.13编写一段代码,打印出一个M行N列的二维数组的转置(交换行和列). public class Test { public static void main(String[] arg ...
- m行n列最大值和最小值C语言,找数组最值 按如下函数原型编程从键盘输入一个m行n列的二维数...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 找数组最值 按如下函数原型编程从键盘输入一个m行n列的二维数组,然后计算数组中元素的最大值及其所在的行列下标值.其中,m和n的值由用户键盘输入.已知m和n ...
- 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所指定一维数组中.二 ...
- python二维数组排序_Python实现二维数组按照某行或列排序的方法【numpy lexsort】...
本文实例讲述了Python实现二维数组按照某行或列排序的方法.分享给大家供大家参考,具体如下: lexsort支持对数组按指定行或列的顺序排序:是间接排序,lexsort不修改原数组,返回索引. (对 ...
- PHP如何判断一个数组是一维数组或者是二维数组?用什么函数?
如题:如何判断一个数组是一维数组或者是二维数组?用什么函数? 判断数量即可 <?php if (count($array) == count($array, 1)) {echo '是一维数组'; ...
- 在主方法中定义一个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’;输出这个数组中的所有元素。...
//在主方法中定义一个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是'*',其余 位置存的是'#':输出这个数组中的所有元素.char [][]y=new char [10][10] ...
最新文章
- 【codeforces 508B】Anton and currency you all know
- 第四次团队作业——系统设计
- ubuntu多版本python和pip切换
- 制作.sens数据集跑通bundlefusion
- (八)Spring与MyBatis整合
- 前端学习(3042):vue+element今日头条管理-用户退出
- 学无止境,我还在进步
- Catch That Cow抓住那只奶牛(BFS,广度优先搜索)
- VDN For PB Web实现消息推送
- 5款App帮你创建时间轴
- 【二次开发应用】安信可ESP32/ESP8266模组入网阿里生活物联网平台
- JPSE问题诊断指导四——hprof
- unity sky Time of Day - Dynamic Sky Dome
- python--webdriver驱动浏览器操作(基础知识)
- 用Beamer做slides-模板
- npm install 报错:found XXX vulnerabilities (XXX low, X moderate),run `npm audit fix` to fix them, or `
- Python实现——依次计算一系列给定字符串的字母值,字母值为字符串中每个字母对应的编号值(A对应1,B对应2,以此类推,不区分大小写字母,非字母字符对应的值为0)的总和。
- linux 动画软件,免费开源的 2D 动画软件
- 植物大战僵尸内存地址(转)
- 【字节日常实习-前端凉经】
热门文章
- CSDN注销账号、解绑手机、邮箱问题(已解决)
- uCOS2源码分析3-RTOS核心代码视频课程-第4季第4部分-朱有鹏-专题视频课程
- R语言dplyr包group_by函数、summarise函数、where函数和across函数计算dataframe数据中所有的数值数据列的均值、across函数对多个列执行相同的操作
- 使用策略模式的设计方式来实现对数组的排序,提供两种具体的实施策略,冒泡排序法和选择排序法
- python实现将json字幕转srt
- 【MySQL进阶】多表连接的原理
- 《心动的信号4》收官,珍爱网红娘解读爱情观
- 大学生怎样学好java
- vue+element表格的左右布局及动态添加行
- Matlab求解非线性规划(fmincon函数的使用)