如何将numpy数组中的值组织成包含一定值范围的区间?

10

我试图对 numpy 数组中的值进行排序,以便我可以存储在某个范围内的所有值(这可能可以更好地措辞)。无论如何,我将给出一个我试图实现的示例。我有一个名为 bins 的数组,它看起来像这样:

bins = array([11,11.5,12,12.5,13,13.5,14])

我还有另一个数组叫做avgs:

avgs = array([11.02, 13.67, 11.78, 12.34, 13.24, 12.98, 11.3, 12.56, 13.95, 13.56,
              11.64, 12.45, 13.23, 13.64, 12.46, 11.01, 11.87, 12.34, 13,87, 13.04,
              12.49, 12.5])

我试图做的是找到在bins数组值之间的avgs数组的索引值。例如,我正在尝试创建一个while循环,为每个bin创建新变量。第一个bin将包含所有介于bins[0]bins[1]之间的内容,看起来像这样:
bin1 = array([0, 6, 15])

这些索引值对应于avgs中的值11.02、11.3和11.01,并且是bins中索引值0和1之间avgs的值。我还需要其他的箱子,所以另一个例子是:

bin2 = array([2, 10, 16])

然而,对我来说挑战性的部分在于,binsavgs的大小会根据其他参数变化,因此我试图构建一个可以扩展到更大或更小的binsavgs数组的东西。
1个回答

14

Numpy拥有一些相当强大的计数函数。

>>> binplace = np.digitize(avgs, bins) #Returns which bin an average belongs
>>> binplace
array([1, 6, 2, 3, 5, 4, 1, 4, 6, 6, 2, 3, 5, 6, 3, 1, 2, 3, 5, 7, 5, 3, 4])

>>> np.where(binplace == 1)
(array([ 0,  6, 15]),)
>>> np.where(binplace == 2)
(array([ 2, 10, 16]),)

>>> avgs[np.where(binplace == 1)]
array([ 11.02,  11.3 ,  11.01])

1
感谢您提供这个好答案。我想补充一点,即 np.digitize() 返回的索引从1开始,而不是标准的0。我认为他们选择这种实现方式是因为箱子是间隔,但这可能会导致一些错误。只要小心!!! - Thales Carl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接