交叉数组对的Python bin集

时间:2019-12-24 22:06:40

标签: python arrays numpy

我有一组成对的numpy数组。一对中的每个阵列的长度相同,但是不同对中的阵列具有不同的长度。此集合中的一对数组的示例是:

Time: [5,8,12,17,100,121,136,156,200]
Score: [3,4,5,-10,-90,-80,-70,-40,10]

另一对是:

Time: [6,7,9,15,199]
Score: [5,6,7,-11,-130]

我需要根据时间对所有这些对进行平均(或执行合并)。即,应将时间分为10个间隔,并且每个间隔的相应分数都必须平均。

因此,对于以上2对,我想要以下结果:

Time: [1-10,11-20,21-30,31-40,41-50,...,191-200]
Score: [(3+4+5+6+7)/5, (5-10-11)/2, ...]

我该怎么做?是否有比将所有东西单独装箱然后取平均值的简单方法?如何根据另一个阵列的仓位对一个阵列进行仓位?即对于单个数组,如何将时间数组分成10个间隔,然后使用此结果以一致的方式对相应的得分数组进行归档?

1 个答案:

答案 0 :(得分:1)

您可以使用scipy.stats.binned_statistic。这是直方图函数的一般化。直方图将空间划分为bin,然后返回每个bin中的点数的 count 。此功能允许计算每个bin中的值(或一组值)的和,均值,中位数或其他统计信息

from scipy import stats
import numpy as np

T1 = [5,8,12,17,100,121,136,156,200]
S1 = [3,4,5,-10,-90,-80,-70,-40,10]

T2 = [6,7,9,15,199]
S2 = [5,6,7,-11,-130]

# Merging all Times and Scores in order
Time = T1 + T2
Score = S1 + S2

output = stats.binned_statistic(Time, Score, statistic='mean',range=(0,200), bins=20)

averages = output[0]

# For empty bins, it generates NaN, we can replace them with 0
print( np.nan_to_num(averages, 0) )

# Output of this code: 
# [  5.          -5.33333333   0.           0.           0.
#    0.           0.           0.           0.           0.
#  -90.           0.         -80.         -70.           0.
#  -40.           0.           0.           0.         -60.        ]

有关更多信息,请遵循this link