numpy中的“as of”

7 投票
1 回答
927 浏览
提问于 2025-04-16 17:03

我想在 numpy 中实现一个“截至”操作符。具体来说,如果:

  1. t1 是一个严格递增的时间戳的 n 维向量;
  2. d1 是一个 n x p 的观察矩阵,其中第 i 行对应于 t1[i]
  3. t2 是一个同样严格递增的时间戳的 m 维向量;

我需要创建一个 m x p 的矩阵 d2,其中 d2[i] 就是 d1[j],而 j 是满足 t1[j] <= t2[i] 的最大值。

换句话说,我需要根据 t2 中的时间戳获取 d1 的行。

用纯 Python 写这个很简单,但我想知道有没有办法避免使用解释型循环(因为 nmp 都很大)。

这些时间戳是 datetime.datetime 对象,观察值是浮点数。

编辑:对于那些无法满足 t1[j] <= t2[i] 的情况(也就是说,t2 中的某个时间戳早于所有 t1 中的时间戳),我希望得到 NaN 的行。

1 个回答

11

你最好的选择是 numpy.searchsorted()

d1[numpy.searchsorted(t1, t2, side="right") - 1]

这个函数会帮你找到一个位置,告诉你在 t1 这个列表中,t2 的值应该插入到哪里,才能保持顺序。这里的 side="right"- 1 是为了确保它的行为符合你的要求。

补充说明:如果你想在条件 t1[j] <= t2[i] 无法满足的地方得到 NaN(空值),你可以使用

nan_row = numpy.repeat(numpy.nan, d1.shape[1])
d1_nan = numpy.vstack((nan_row, d1))
d2 = d1_nan[numpy.searchsorted(t1, t2, side="right")]

撰写回答