按值拆分为相等的部分

时间:2018-05-22 07:11:16

标签: python numpy split data-science

是否有一种方便的方法来分割数组,这样无论每个部分中的元素数量是多少,它所包含的值范围都是相同的?

假设我们有范围内的数据(0,100)。让数组的大小为1000.前500个元素都在(0,20)中,300个元素在(20,40)中,依此类推。我想操纵分为20,40,60和80的小节中的值。

数据看起来像这样:

1st div:  0,  0,  0, ... 17, 18
2nd div: 22, 22, 24, ... 37, 39
3rd div: 40, 41, 41, ... 55, 59
4th div: 65, 68, 73, 76, 76
5th div: 93, 96

按部分大小分割相同大小的数组非常容易。但我正在使用一些简单的平均来绘制趋势线,并且每个部分中的数据量会有所不同。我知道分裂点。

可以使用np.where来制作arr > border1之类的条件,仅使用第一个元素,合并然后拆分,但这似乎是一种长期的处理方式。

任何指针都将非常感激。我不可能是唯一有这个问题的人。此外,如果另一个图书馆做这种事情,我当然愿意使用它。

2 个答案:

答案 0 :(得分:3)

使用np.searchsorted获取那些将拆分为组的索引,然后将这些索引拆分为np.split -

In [41]: np.random.seed(0)

In [42]: a = np.sort(np.random.randint(0,100,(10000)))

In [43]: bins = [20,40,60,80]

In [46]: idx = np.searchsorted(a, bins)

In [47]: np.split(a,idx)
Out[47]: 
[array([ 0,  0,  0, ..., 19, 19, 19]),
 array([20, 20, 20, ..., 39, 39, 39]),
 array([40, 40, 40, ..., 59, 59, 59]),
 array([60, 60, 60, ..., 79, 79, 79]),
 array([80, 80, 80, ..., 99, 99, 99])]

答案 1 :(得分:2)

如果输入元素已经排序,请考虑使用groupby:

[ 133, 19, 7, 147, 49, 21, 7, 3, 427, 61, 7, 266, 133, 38, 19, 14, 7, 2 ]