考虑到形状100x100x100的直方图,我想找到2个最高值a和b,以及它们的指数(a1,a2,a3)和(b1,b2,b3),例如:
hist[a1][a2][a3] = a
hist[b1][b2][b3] = b
我们可以使用hist.max()轻松获得最高值,但是如何在ndarray中获得X最高值?
据我所知,通常使用np.argmax来检索值索引,但在这种情况下:
hist.argmax().shape = () # single value
for i in range(3):
hist.argmax(i).shape = (100, 100)
如何获得形状(3),每个维度具有一个值的元组?
答案 0 :(得分:11)
您可以首先在展平版本的数组上使用numpy.argpartition
来获取顶级k
项的索引,然后您可以使用{{按照数组的形状转换这些1D索引3}}:
>>> arr = np.arange(100*100*100).reshape(100, 100, 100)
>>> np.random.shuffle(arr)
>>> indices = np.argpartition(arr.flatten(), -2)[-2:]
>>> np.vstack(np.unravel_index(indices, arr.shape)).T
array([[97, 99, 98],
[97, 99, 99]])
)
>>> arr[97][99][98]
999998
>>> arr[97][99][99]
999999
答案 1 :(得分:2)
您可以使用where:
a=np.random.random((100,100,100))
np.where(a==a.max())
(array([46]), array([62]), array([61]))
进入一个阵列:
np.hstack(np.where(a==a.max()))
array([46, 62, 61])
并且,当OP要求元组时:
tuple(np.hstack(np.where(a==a.max())))
(46, 62, 61)
编辑:
要获取N
最大集合的索引,您可以使用heapq
模块中的nlargest
函数:
N=3
np.where(a>=heapq.nlargest(3,a.flatten())[-1])
(array([46, 62, 61]), array([95, 85, 97]), array([70, 35, 2]))
答案 2 :(得分:0)
我想你可以这样做:
(伪代码)
#work on a copy
working_hist = copy(hist)
greatest = []
min_value = hist.argmin().shape
#while searching for the N greatest values, do N times
for i in range(N):
#get the current max value
max_value = hist.argmax().shape
#save it
greatest.append(max_value)
#and then replace it by the minimum value
hist(max_value.shape)= min_value
我多年没有使用过numpy,所以我不确定语法。代码就在这里,以便为您提供类似答案的伪代码。
如果您还保留了您提取的值的位置,则可以通过使用提取的信息在末尾恢复矩阵来避免处理项目的副本。