我有一个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有效地解决它。
答案 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