有没有一种快速方法可以将numpy数组中的一个元素与该数组中其余元素进行比较?

Wes*_*man 3 python arrays numpy

我有一个数组,我想看看该数组中的任何元素是否大于或等于该数组中的任何其他元素.我可以做两个for循环,但我的数组长度为10,000或更大,因此创建了一个非常慢的程序.无论如何,我能更快地做到这一点?

[编辑]我只需要它来查看它是否大于或等于我正在查看的元素之后的元素,如果是,我需要知道它的索引.

[编辑]我将更清楚地重新解释我的问题,因为当前的解决方案不适用于我需要的东西.首先,这里有一些代码

x=linspace(-10, 10, 10000)
t=linspace(0,5,10000)

u=np.exp(-x**2)

k=u*t+x
Run Code Online (Sandbox Code Playgroud)

所以我采用一个x数组,通过将其置于高斯中获得高度,然后基于该高度,即x值通过空间传播的速度,我用k找到.我的问题是,我需要找到何时高斯变为双值函数(或换句话说,当发生冲击时).如果我做argmax解决方案,我总是得到k中的最后一个值,因为它非常接近于零,我需要在我的函数中给出一个double值的元素之后的第一个值.

[编辑]小例子

x=[0,1,2,3,4,5,6,7,8,9,10] #Input 
k=[0,1,2,3,4,5,6,5,4,10] #adjusted for speed

output I want
in this case, 5 is the first number that goes above a number that comes after it.
So I need to know the index of where 5 is located and possibly the index 
of the number that it is greater than
Run Code Online (Sandbox Code Playgroud)

eca*_*mur 5

大于后一个值的第一个值必然对应于局部最小值中的最小值:

k = np.array([0,1,2,3,4,5,6,5,4,10])
lm_i = np.where(np.diff(np.sign(np.diff(k))) > 0)[0] + 1
mlm = np.min(k[lm_i])
mlm_i = lm_i[np.argmin(k[lm_i])]
Run Code Online (Sandbox Code Playgroud)

第一个值大于后一个值的索引是第一个大于最小局部最小值的索引:

i = np.where(k > mlm)[0][0]
Run Code Online (Sandbox Code Playgroud)

解决方案的情节

(忽略图表看起来穿过切线处的水平线;这只是一个显示人工制品.)

作为单线:

np.where(k > np.min(k[np.where(np.diff(np.sign(np.diff(k))) > 0)[0] + 1]))[0][0]
Run Code Online (Sandbox Code Playgroud)

请注意,这是约.比root的解决方案快1000倍,因为它完全被矢量化:

%timeit np.where(k > np.min(k[np.where(np.diff(np.sign(np.diff(k))) > 0)[0] + 1]))[0][0]
1000 loops, best of 3: 228 us per loop
Run Code Online (Sandbox Code Playgroud)