对直方图箱进行操作 Python

我试图在np.histrogram函数生成的 bin 范围内找到值的中位数。我将如何仅选择 bin 范围内的值并对这些特定值进行操作?以下是我的数据示例以及我正在尝试执行的操作:


x = [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1]

y 值可以有任何类型的 x 值与之关联,例如:


hist, bins = np.histogram(x)

hist = [129, 126, 94, 133, 179, 206, 142, 147, 90, 185] 

bins = [0.,         0.09999926, 0.19999853, 0.29999779, 0.39999706,

        0.49999632, 0.59999559, 0.69999485, 0.79999412, 0.8999933,

        0.99999265]

所以,我试图在生成的第一个 bin 中找到 129 个值的中值 y 值,等等。


拉莫斯之舞
浏览 190回答 3
3回答

慕婉清6462132

一种方法是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.0dtype: float64如果您想留在 NumPy,您可能需要查看np.digitize().

九州编程

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]

SMILET

您可以通过使用计数作为索引对数据的排序版本进行切片来实现此目的: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() insteadxsorted = np.sort(x)ix = [0] + hist.cumsum()[np.median(x[i:j]) for i,j in zip(ix[:-1], ix[1:])]这将把中位数作为标准的 Python 列表。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python