O.r*_*rka 5 python indexing numpy max cumulative-sum
我正在尝试获取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)
Run Code Online (Sandbox Code Playgroud)
我们可以利用np.maximum.accumulate-
idx_max = np.flatnonzero(np.isclose(np.maximum.accumulate(z),z))[1:]
val_max = z[idx_max]
Run Code Online (Sandbox Code Playgroud)
基本思想是,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]
Run Code Online (Sandbox Code Playgroud)
但是,给定了起始值,更早的假设使我们的代码更容易/紧凑/简短。
| 归档时间: |
|
| 查看次数: |
227 次 |
| 最近记录: |