我试图获取向量中所有累积最大值的x
和y
坐标。我写了一个天真的for-loop
但我觉得有一些方法可以用numpy
更优雅。
有人知道numpy
中可以执行此操作的任何函数,屏蔽技术或单行吗?
细节应通过以下图表描述:
# Generate data
x = np.abs(np.random.RandomState(0).normal(size=(100)))
y = np.linspace(0,1,x.size)
z = x*y
# Get maximiums
idx_max = list()
val_max = list()
current = 0
for i,v in enumerate(z):
if v > current:
idx_max.append(i)
val_max.append(v)
current = v
# Plot them
with plt.style.context("seaborn-white"):
fig, ax = plt.subplots(figsize=(10,3), ncols=2)
ax[0].plot(z)
ax[1].plot(z, alpha=0.618)
ax[1].scatter(idx_max, val_max, color="black", edgecolor="maroon", linewidth=1.618)
答案 0 :(得分:4)
我们可以使用np.maximum.accumulate
-
idx_max = np.flatnonzero(np.isclose(np.maximum.accumulate(z),z))[1:]
val_max = z[idx_max]
基本思想是,当与当前元素进行比较时,此accumulative max
值指示哪些元素位置负责“提升”运行的最大值。负责任的是我们需要的指数idx_max
。由于我们正在使用浮点数,我们需要在np.isclose
中加入一些容差。
[1:]
部分是因为起始当前值为0
,因此z[0]
。因此,v > current
部分不会将起始索引附加到输出中。要准确地说明它,应该是 -
current = 0
idx = np.flatnonzero(np.isclose(np.maximum.accumulate(z),z))
idx = idx[z[idx] > current]
但是,考虑到起始值,先前做出的假设使我们的代码更容易/紧凑/更短。