我有两个具有相同形状的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的数组超出范围
答案 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)]))