【发布时间】:2019-10-29 04:03:24
【问题描述】:
我有一个 hape (365, x, y) 的 3 维数组,其中 36 对应于 =daily 数据。在某些情况下,时间轴上的所有元素axis=0 都是np.nan。
axis=0 沿线每个点的时间序列如下所示:
我需要找到最大值(峰值数据)出现的索引,然后是峰值两侧的两个最小值。
import numpy as np
a = np.random.random(365, 3, 3) * 10
a[:, 0, 0] = np.nan
peak_mask = np.ma.masked_array(a, np.isnan(a))
peak_indexes = np.nanargmax(peak_mask, axis=0)
我可以使用以下方法找到峰值之前的最小值:
early_minimum_indexes = np.full_like(peak_indexes, fill_value=0)
for i in range(peak_indexes.shape[0]):
for j in range(peak_indexes.shape[1]):
if peak_indexes[i, j] == 0:
early_minimum_indexes[i, j] = 0
else:
early_mask = np.ma.masked_array(a, np.isnan(a))
early_loc = np.nanargmin(early_mask[:peak_indexes[i, j], i, j], axis=0)
early_minimum_indexes[i, j] = early_loc
得到的波峰和波谷如下所示:
对于大型数组(1m+ 个元素),这种方法在时间上是非常不合理的。有没有更好的方法来使用 numpy 做到这一点?
【问题讨论】:
-
你可能想要either一个掩码数组或 np.nanargmax,而不是两者。我会选择后者,因为前者在处理掩码方面效率不高。
-
@MadPhysicist 在某些情况下,我在 0 轴上有所有 nan 值。没有掩码,np.nanargmax 返回
ValueError: All-NaN slice encountered -
@vrlo。你可以用 -1 或其他东西替换 nans 吗?看起来你的数据都是正面的......
-
我已经起草了 90% 的答案,但卡住了,所以问了另一个问题:stackoverflow.com/q/58595650/2988730
-
好问题。绝对让我深思。