是否有一种方便的方法来分割数组,这样无论每个部分中的元素数量是多少,它所包含的值范围都是相同的?
假设我们有范围内的数据(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
之类的条件,仅使用第一个元素,合并然后拆分,但这似乎是一种长期的处理方式。
任何指针都将非常感激。我不可能是唯一有这个问题的人。此外,如果另一个图书馆做这种事情,我当然愿意使用它。
答案 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 ]