根据多个数组的多个条件为numpy数组赋值

问题描述 投票:0回答:1

我在 netcdf 文件中有海洋和大气数据集。海洋数据将包含

nan
或陆地区域上的任何其他值
-999
。对于这个例子,假设它是
nan
。示例数据将如下所示:-

import numpy as np
ocean = np.array([[2, 4, 5], [6, np.nan, 2], [9, 3, np.nan]])
atmos = np.array([[4, 2, 5], [6, 7, 3], [8, 3, 2]])

现在我想对海洋和大气数据应用多个条件来创建一个新数组,该数组仅包含从

1
8
的值。例如,在海洋数据中,
2
4
之间的值将被指定为
1
,而
4
6
之间的值将被指定为
2
。 atmos 数据集也进行了相同的比较。

为了简化比较和赋值操作,我制作了一个 bin 值列表,并使用

np.digitize
进行分类。

bin1 = [2, 4, 6]
bin2 = [4, 6, 8]
ocean_cat = np.digitize(ocean, bin1)
atmos_cat = np.digitize(atmos, bin2) 

产生以下结果:-

[[1 2 2]
 [3 3 1]
 [3 1 3]]

[[1 0 1]
 [2 2 0]
 [3 0 0]]

现在我想要上述两个数组结果之间的元素最大值。因此,我使用

np.fmax
来获得元素方面的最大值。

final_cat = np.fmax(ocean_cat, atmos_cat)
print(final_cat)

产生以下结果:-

[[1 2 2]
 [3 3 1]
 [3 1 3]]

上面的结果差不多就是我需要的了。我在这里发现的唯一问题是缺少

nan
值。我想要的最终结果是:-

[[1 2 2]
 [3 nan 1]
 [3 1 nan]]

有人可以帮我用原始海洋数组相同索引中的 nan 替换值吗?

python numpy netcdf
1个回答
0
投票

一个简单的选择是用

numpy.where
:

屏蔽输出
bin1 = [2, 4, 6]
bin2 = [4, 6, 8]
ocean_cat = np.digitize(ocean, bin1)
atmos_cat = np.digitize(atmos, bin2) 
final_cat = np.where(np.isnan(ocean), np.nan,
                     np.fmax(ocean_cat, atmos_cat))

输出:

array([[ 1.,  2.,  2.],
       [ 3., nan,  1.],
       [ 3.,  1., nan]])
© www.soinside.com 2019 - 2024. All rights reserved.