Python Numpy:用另一个数组中对应的值替换一个数组中的值

12

我正在使用Python中的Numpy数组(具体来说是转换为2D数组的栅格图像),我想做的是将一个包含任意虚拟值-999表示“无数据”的数组替换为相同大小和形状的另一个数组中对应位置的“真实”值。我没有找到非常相似的问题,但请注意我是Python和Numpy的新手。

但我想要做的是:

array_a = 
([[0.564,-999,-999],
 [0.234,-999,0.898],
 [-999,0.124,0.687], 
 [0.478,0.786,-999]])

array_b = 
([[0.324,0.254,0.204],
 [0.469,0.381,0.292],
 [0.550,0.453,0.349], 
 [0.605,0.582,0.551]])

使用数组array_b的值填充数组array_a中的-999值并创建一个新数组:

new_array_a = 
([[0.564,0.254,0.204],
 [0.234,0.381,0.898],
 [0.550,0.124,0.687], 
 [0.478,0.786,0.551]])

我不想改变数组的形状或尺寸,因为之后我会转换回栅格图像,所以需要正确的值在正确的位置上。你有什么建议?

我不希望改变数组的形状或尺寸,因为之后我需要将其转换回栅格图像,所以需要确保正确的值位于正确的位置。请问有什么最好的方法实现这一点?


4
了解一下 masking。具体内容可参考此链接:https://docs.scipy.org/doc/numpy/user/basics.indexing.html#boolean-or-mask-index-arrays。 - Divakar
是的,我研究过了,我能够使用以下方法屏蔽掉 array_a 中的 -999 值:mask_a = ma.masked_where(array_a < -1,array_a)但接下来怎么办呢?我只是删掉了 -999 的值,但我不知道如何将 array_b 中的值放到相同的位置? - Matt
2个回答

24

只需进行布尔掩码:

mask = (array_a == -999)
new_array = np.copy(array_a)
new_array[mask] = array_b[mask]

嘿,太好了!我觉得这个可以用!谢谢!
array_a = np.array([[0.564,-999,-999], ... [0.234,-999,0.898], ... [-999,0.124,0.687], ... [0.478,0.786,-999]]) array_b = np.array([[0.324,0.254,0.204], ... [0.469,0.381,0.292], ... [0.550,0.453,0.349], ... [0.605,0.582,0.551]]) mask = (array_a == -999) new_array = np.copy(array_a) new_array[mask] = array_b[mask] print new_array [[ 0.564 0.254 0.204] [ 0.234 0.381 0.898] [ 0.55 0.124 0.687] [ 0.478 0.786 0.551]]
- Matt

4

你只需要做的是

array_a[array_a==-999]=array_b[array_a==-999]

我们正在对数组元素设置布尔条件,以更新值为-999。

import numpy as np
array_a =np.array([[0.564,-999,-999],
 [0.234,-999,0.898],
 [-999,0.124,0.687], 
 [0.478,0.786,-999]])

array_b =np.array([[0.324,0.254,0.204],
 [0.469,0.381,0.292],
 [0.550,0.453,0.349], 
 [0.605,0.582,0.551]])
array_a[array_a==-999]=array_b[array_a==-999]

运行这段代码片段 在此输入图片描述

[1]: https://istack.dev59.com/oRdsE.webp


1
我怀疑这并没有帮助 - 或者根本就不起作用。如果要说服我,解释一下它的工作原理以及为什么它应该解决问题。 - Yunnosch
只需取两者条件都为True的部分,这很简单。 - PRAVENDRA S KHINCHI B16EE026
请在您的回答中解释(如何和为什么)。 - Yunnosch
1
请不要仅仅发布代码作为答案,还要提供解释您的代码是如何解决问题的。带有解释的答案通常更有帮助和更高质量,并且更有可能吸引赞同。 - Dima Kozhevin
@DimaKozhevin 我已经更新了。请再看一遍。 - PRAVENDRA S KHINCHI B16EE026

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接