如何找到重叠的numpy数组的索引和最大值

时间:2019-02-08 09:37:37

标签: python numpy

我有两个具有相同形状的numpy数组。一种带有值,另一种带有“区域”。我需要在valuearr中找到与zonearr中的区域3重叠的最大值和值的索引:

import numpy as np
valuearr = np.array([[10,11,12,13],
                     [21,22,23,24],
                     [31,32,33,34],
                     [41,42,43,44]])

zonearr = np.array([ [0,0,1,1],
                     [0,0,1,1],
                     [3,3,0,0],
                     [3,3,0,0]])

我正在尝试:

valuearr[np.argwhere(zonearr==3)].max()
44

应为42。

要获取索引,我会尝试

ind = np.unravel_index(np.argmax(valuearr[np.argwhere(zonearr==3)], axis=None), valuearr.shape)

这当然不起作用,因为最大值不是44,并且还会给出错误:

  

builtins.ValueError:索引19对于大小为16的数组超出范围

2 个答案:

答案 0 :(得分:2)

您可以使用蒙版数组来执行所需的操作。

使用:

import numpy as np
valuearr = np.array([[10,11,12,13],
                     [21,22,23,24],
                     [31,32,33,34],
                     [41,42,43,44]])

zonearr = np.array([ [0,0,1,1],
                     [0,0,1,1],
                     [3,3,0,0],
                     [3,3,0,0]], dtype=np.int)

首先屏蔽掉zonearr不等于3的所有值。

masked = np.ma.masked_array(valuearr, mask = (zonearr!=3))

然后使用argmax找到最大值的位置:

idx_1d = np.argmax(masked)

最后,将其转换为2d索引:

idx_2d = np.unravel_index(idx_1d, valuearr.shape)

并打印:

print(idx_2d, valuearr[idx_2d])

给出:

(3, 1) 42

答案 1 :(得分:1)

请尝试以下代码

np.max(valuearr[np.where(zonearr==3)])

它从zonearr获取元素的索引,其中值等于'3'。随后,通过获取的索引从valuearr获得最大元素。

要获取元素42的索引(按照您的示例),请使用以下代码:

np.argwhere(valuearr==np.max(valuearr[np.where(zonearr==3)]))