3 回答
TA贡献1804条经验 获得超2个赞
一种方法是pandas.cut():
>>> import pandas as pd
>>> import numpy as np
>>> np.random.seed(444)
>>> x = np.random.randint(0, 25, size=100)
>>> _, bins = np.histogram(x)
>>> pd.Series(x).groupby(pd.cut(x, bins)).median()
(0.0, 2.4] 2.0
(2.4, 4.8] 3.0
(4.8, 7.2] 6.0
(7.2, 9.6] 8.5
(9.6, 12.0] 10.5
(12.0, 14.4] 13.0
(14.4, 16.8] 15.5
(16.8, 19.2] 18.0
(19.2, 21.6] 20.5
(21.6, 24.0] 23.0
dtype: float64
如果您想留在 NumPy,您可能需要查看np.digitize().
TA贡献1785条经验 获得超4个赞
np.digitize并将np.searchsorted您的数据与垃圾箱匹配。在这种情况下,后者更可取,因为它会减少不必要的检查(可以安全地假设您的垃圾箱已排序)。
如果您查看np.histogram(注释部分)的文档,您会注意到右侧的垃圾箱都是半开的(最后一个除外)。这意味着您可以执行以下操作:
x = np.abs(np.random.normal(loc=0.75, scale=0.75, size=10000))
h, b = np.histogram(x)
ind = np.searchsorted(b, x, side='right')
现在ind包含每个数字的标签,指示它属于哪个 bin。您可以计算中位数:
m = [np.median(x[ind == label]) for label in range(b.size - 1)]
如果您能够对输入数据进行排序,您的工作就会变得更容易,因为您可以使用视图而不是使用掩码为每个 bin 提取数据。np.split在这种情况下是一个不错的选择:
x.sort()
sections = np.split(x, np.cumsum(h[:-1]))
m = [np.median(arr) for arr in sections]
TA贡献1796条经验 获得超4个赞
您可以通过使用计数作为索引对数据的排序版本进行切片来实现此目的:
x = np.random.rand(1000)
hist,bins = np.histogram(x)
ix = [0] + hist.cumsum().tolist()
# if don't mind sorting your original data, use x.sort() instead
xsorted = np.sort(x)
ix = [0] + hist.cumsum()
[np.median(x[i:j]) for i,j in zip(ix[:-1], ix[1:])]
这将把中位数作为标准的 Python 列表。
添加回答
举报