Python 具有周期性边界条件的数据直方图

Python 具有周期性边界条件的数据直方图,python,numpy,matplotlib,Python,Numpy,Matplotlib,我想制作一个柱状图,其中数据位于周期空间中,但一个箱子与边界相交,也就是说,最左边和最右边的箱子应该是一个相同的箱子 例如,如果我有范围从0到360的角度数据,并且希望创建N、S、E和W面元,则N面元应包括范围从0到45和315到360的数据。我不能像np.histogramdata那样做,bins=[315,45135225315],因为bins必须单调增加 当然,我可以通过“旋转”it数据[data>bins.max]=360来预处理我的数据,但这似乎是一种黑客行为,我想知道是否有更干净的方

我想制作一个柱状图,其中数据位于周期空间中,但一个箱子与边界相交,也就是说,最左边和最右边的箱子应该是一个相同的箱子

例如,如果我有范围从0到360的角度数据,并且希望创建N、S、E和W面元,则N面元应包括范围从0到45和315到360的数据。我不能像np.histogramdata那样做,bins=[315,45135225315],因为bins必须单调增加

当然,我可以通过“旋转”it数据[data>bins.max]=360来预处理我的数据,但这似乎是一种黑客行为,我想知道是否有更干净的方法。

你可以使用np.Digital:

还是有点像黑客。

你可以使用np.Digitalize:


还是有点像黑客。

你可以这样做:

a = 360 * rand(5000)
look_up = np.array([0, 1, 1, 2, 2, 3, 3, 0])
ind = (a//45).astype(np.int8)
out = np.bincount(look_up[ind])
基本上,您可以创建一个查找数组,该数组中的条目数是案例中所需箱子数的两倍。然后将值除以要索引到查找数组中的存储单元间距的一半,我们使用numpy索引魔术来实现这一点。np.bincount than返回每个存储单元被命中的次数,这是您想要的直方图

您还可以使用直方图和一些切片技巧来实现这一点

a = 360 * rand(50000)

h, be = np.histogram(a, bins=8, range=(0, 360))  # 2x bins

h_p = np.sum(np.r_[h[-1], h[:-1]].reshape(-1, 2), axis=1) # rotate and sum
be_p = np.r_[np.r_[be[-2], be[:-2]][::2], be[-2]]         # rotate and skip
作为旁注,通过以下方式换档可能会更快

data_shifted = np.mod(data + 45, 360.0)

您可以这样做:

a = 360 * rand(5000)
look_up = np.array([0, 1, 1, 2, 2, 3, 3, 0])
ind = (a//45).astype(np.int8)
out = np.bincount(look_up[ind])
基本上,您可以创建一个查找数组,该数组中的条目数是案例中所需箱子数的两倍。然后将值除以要索引到查找数组中的存储单元间距的一半,我们使用numpy索引魔术来实现这一点。np.bincount than返回每个存储单元被命中的次数,这是您想要的直方图

您还可以使用直方图和一些切片技巧来实现这一点

a = 360 * rand(50000)

h, be = np.histogram(a, bins=8, range=(0, 360))  # 2x bins

h_p = np.sum(np.r_[h[-1], h[:-1]].reshape(-1, 2), axis=1) # rotate and sum
be_p = np.r_[np.r_[be[-2], be[:-2]][::2], be[-2]]         # rotate and skip
作为旁注,通过以下方式换档可能会更快

data_shifted = np.mod(data + 45, 360.0)