我正在寻找一种在 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]
.
换句话说,我需要获取 d1
的行截至 t2
中的时间戳.
用纯 Python 很容易写这个,但我想知道是否有办法避免解释循环( n
、 m
和 p
非常大)。
时间戳是 datetime.datetime
对象。观测值是浮点值。
编辑:对于 t1[j] <= t2[i]
的条目无法满足(即 t2
中的时间戳先于 t1
中的所有时间戳),理想情况下我希望获得 NaN
的行
最佳答案
您最好的选择是 numpy.searchsorted()
:
d1[numpy.searchsorted(t1, t2, side="right") - 1]
这将搜索 t2
的值所在的索引必须插入 t1
维持秩序。 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")]
关于python - numpy 中的 "as of",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5898617/