numpy中的“as of”
我想在 numpy
中实现一个“截至”操作符。具体来说,如果:
t1
是一个严格递增的时间戳的n
维向量;d1
是一个n x p
的观察矩阵,其中第i
行对应于t1[i]
;t2
是一个同样严格递增的时间戳的m
维向量;
我需要创建一个 m x p
的矩阵 d2
,其中 d2[i]
就是 d1[j]
,而 j
是满足 t1[j] <= t2[i]
的最大值。
换句话说,我需要根据 t2
中的时间戳获取 d1
的行。
用纯 Python 写这个很简单,但我想知道有没有办法避免使用解释型循环(因为 n
、m
和 p
都很大)。
这些时间戳是 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")]