gpt4 book ai didi

python - 如何在 Python 中使用 numpy 获取累计最大索引?

转载 作者:太空狗 更新时间:2023-10-30 01:04:40 27 4
gpt4 key购买 nike

我正在尝试获取向量中所有累积最大值的 xy 坐标。我写了一个天真的 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)

enter image description here

最佳答案

我们可以利用 np.maximum.accumulate -

idx_max = np.flatnonzero(np.isclose(np.maximum.accumulate(z),z))[1:]
val_max = z[idx_max]

基本思想是,与当前元素相比,此accumulative max 值指示负责“提升”运行最大值的元素位置。负责的是我们需要的索引作为 idx_max。由于我们使用的是 float ,因此我们需要在 np.isclose 中加入一些容差。

[1:] 部分是因为起始当前值为 0z[0] 也是如此。因此,v > current 部分不会将该起始索引附加到输出中。准确地说,它应该是——

current = 0
idx = np.flatnonzero(np.isclose(np.maximum.accumulate(z),z))
idx = idx[z[idx] > current]

但是,给定初始值,之前所做的假设使我们的代码更简单/紧凑/简短。

关于python - 如何在 Python 中使用 numpy 获取累计最大索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49927172/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com