在numpy数组中查找最后一个值

时间:2017-03-22 06:16:37

标签: python numpy

我有一个1d数组,想要找到这样的最后一个值。

a = np.array([1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,2,1])
# find the index that value(7) last appear.
np.argwhere(a >= 7).max()
# output 10

但它适用于1d阵列以及3d阵列。

b = np.tile(a.reshape(15,1,1), reps=(1,30,30))
# now b is 3d array and i want to use same way to the axis = 0 in 3d array.
np.argwhere(b >= 7)
# return a 2d array. It's not what i need.

虽然我可以使用'for'循环另一个轴,但我想通过numpy有效地解决它。

2 个答案:

答案 0 :(得分:2)

首先,要获得最后一次出现7的索引,您可以使用:

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

indices = np.argwhere(a== 7)
last_index = indices[-1]
# 10

现在,如果您有一个三维数组,您仍然可以使用np.argwhere来获取7的出现次数,但每次出现都将在三维空间中。要获得最后一次出现的7,请再次编写

b = np.tile(a.reshape(17,1,1), reps=(1,30,30))
np.argwhere(b==7)[-1]
# [10 29 29]

完全返回您期望的内容。

答案 1 :(得分:2)

要获取最后一个索引,我们可以沿所有轴翻转顺序,然后在匹配项上使用np.argmax()。翻转的想法是利用有效的np.argmax来获取第一个匹配的索引。

因此,实现将是 -

def last_match_index(a, value):
    idx = np.array(np.unravel_index(((a==value)[::-1,::-1,::-1]).argmax(), a.shape))
    return a.shape - idx - 1

运行时测试 -

In [180]: a = np.random.randint(0,10,(100,100,100))

In [181]: last_match_index(a,7)
Out[181]: array([99, 99, 89])

# @waterboy5281's argwhere soln
In [182]: np.argwhere(a==7)[-1]
Out[182]: array([99, 99, 89])

In [183]: %timeit np.argwhere(a==7)[-1]
100 loops, best of 3: 4.67 ms per loop

In [184]: %timeit last_match_index(a,7)
1000 loops, best of 3: 861 µs per loop

如果你想要获得沿轴的最后一个索引,比如说axis=0并沿两个轴迭代,让我们说最后两个轴,我们可以采用相同的方法 -

a.shape[0] - (a==7)[::-1,:,:].argmax(0) - 1

示例运行 -

In [158]: a = np.random.randint(4,8,(100,100,100))
     ...: m,n,r = a.shape
     ...: out = np.full((n,r),np.nan)
     ...: for i in range(n):
     ...:     for j in range(r):
     ...:         out[i,j] = np.argwhere(a[:,i,j]==7)[-1]
     ...:         

In [159]: out1 = a.shape[0] - (a==7)[::-1,:,:].argmax(0) - 1

In [160]: np.allclose(out, out1)
Out[160]: True