gpt4 book ai didi

python - 将时间数组(事件)转换为时间 x 之前的事件数数组

转载 作者:太空宇宙 更新时间:2023-11-04 05:08:43 26 4
gpt4 key购买 nike

假设我有一个时间数组。我先验地知道最大时间是 1,所以数组可能看起来像

events = [0.1, 0.2, 0.7, 0.93, 1.37]

该数组中的数字表示事件在时间间隔 [0,1] 内发生的时间(我忽略任何大于 1 的值)。我不知道数组的先验大小,但我确实对其大小有合理的上限(如果这很重要),因此我什至可以在需要时安全地截断它。

我需要将该数组转换成一个数组,该数组计算到时间 x 为止的事件 的数量,其中 x 是时间间隔内的一组均匀间隔的数字 (linspace)。因此,例如,如果该数组的粒度(=大小)是 7,我的函数的结果应该是这样的:

def count_events(events, granularity):
...

>>> count_events([0.1, 0.2, 0.7, 0.93, 1.37], 7)
array([0, 1, 2, 2, 2, 3, 4])
# since it checks at times 0, 1/6, 1/3, 1/2, 2/3, 5/6, 1.

我正在寻找一个有效的解决方案。在这里制作循环可能非常容易,但我的事件数组可能很大。事实上,它们不是一维的而是二维的,并且这个计数操作应该是按轴的(就像许多其他 numpy 函数一样)。更准确地说,这是一个二维示例:

def count_events(events, granularity, axis=None):
...

>>> events = array([[0.1, 0.2, 0.7, 0.93, 1.37], [0.01, 0.01, 0.9, 2.5, 3.3]])
>>> count_events(events, 7, axis=1)
array([[0, 1, 2, 2, 2, 3, 4],
[0, 2, 2, 2, 2, 2, 3]])

最佳答案

您可以简单地使用 np.searchsorted -

np.searchsorted(events, d) # with events being a 1D array

,其中 d 是 linspaced 数组,像这样创建 -

d = np.linspace(0,1,7) # 7 being the interval size

2D 案例的运行示例 -

In [548]: events
Out[548]:
array([[ 0.1 , 0.2 , 0.7 , 0.93, 1.37],
[ 0.01, 0.01, 0.9 , 2.5 , 3.3 ]])

In [549]: np.searchsorted(events[0], d) # Use per row
Out[549]: array([0, 1, 2, 2, 2, 3, 4])

In [550]: np.searchsorted(events[1], d)
Out[550]: array([0, 2, 2, 2, 2, 2, 3])

使用 searchsorted 的矢量化版本:searchsorted2d ,我们甚至可以将整个事物矢量化并一次性用于所有行,就像这样 -

In [552]: searchsorted2d(events,d)
Out[552]:
array([[0, 1, 2, 2, 2, 3, 4],
[0, 2, 2, 2, 2, 2, 3]])

关于python - 将时间数组(事件)转换为时间 x 之前的事件数数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43636530/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com