假设我有一个时间序列(t
),其中有多个可观测量(a
和b
):
import numpy as np
t = np.linspace(0, 10, 100)
a = np.random.normal(loc=5, scale=0.1, size=t.size)
b = np.random.normal(loc=1, scale=0.5, size=t.size)
我想得到时间仓的平均值,例如:
bin_edges = np.linspace(0, 12, 12)
bin_index = np.digitize(t, bin_edges) - 1
a_binned = np.zeros(bin_edges.size - 1)
b_binned = np.zeros(bin_edges.size - 1)
for ibin in np.argwhere(np.bincount(bin_index) > 0).flatten():
select = bin_index == ibin
a_binned[ibin] = np.mean(a[select])
b_binned[ibin] = np.mean(b[select])
我的问题:我怎样才能使循环向量化呢?
1条答案
按热度按时间t40tm48m1#
如果你不介意使用pandas:
你可以像这样提取np数组:
只支持numpy:
另一种解决方案,稍微复杂一点,只使用numpy而不使用循环,但假设你的bin是有序的,并按整数计数进行索引(就像你的情况一样):
这背后的想法是使累积和,然后差只是后者除以发生的次数。
最后,你也可以一次添加多个数组,并创建一个方便的函数:
numpy解决方案的速度要快得多(大约100倍),但pandas仍然更清晰,并且经过了战斗测试,特别是它没有做出我为numpy解决方案所做的假设。