如何从histogram2d结果中获取x、y的一维网格计数?
解决方案
首先需要明确:二维直方图的每个网格计数x1y1[i,j],表示的是同时落在第i个x分箱和第j个y分箱的(x1,y1)点对数量。你提到的“每个网格中x1和y1的单独点数之和等于x1y1对应值”存在表述偏差——每个点对同时属于x和y分箱,所以每个网格里的x点数和y点数本质上都是该网格的计数,两者之和会是原计数的2倍,而非等于原计数。
以下针对两种合理需求给出实现方法:
需求1:生成与x1y1同尺寸的x/y边缘分箱计数矩阵
如果是想得到分别对应x、y一维直方图的二维扩展矩阵(每行重复x的分箱计数,每列重复y的分箱计数):
import numpy as np # 原数据生成 x1 = np.random.normal(5,5,340) y1 = np.random.normal(5,5,340) # 生成二维直方图 x1y1, edgex1, edgey1 = np.histogram2d(x=x1,y=y1, bins=10) # 生成x的二维计数矩阵:每行都是x的一维分箱计数 x_counts, _ = np.histogram(x1, bins=edgex1) x_matrix = np.tile(x_counts.reshape(-1, 1), (1, x1y1.shape[1])) # 生成y的二维计数矩阵:每列都是y的一维分箱计数 y_counts, _ = np.histogram(y1, bins=edgey1) y_matrix = np.tile(y_counts.reshape(1, -1), (x1y1.shape[0], 1))
需求2:拆分每个网格的计数为x/y两部分(和等于原计数)
如果是想将每个网格的总点数拆分为x、y两个部分,且两者之和等于原网格计数(比如随机拆分):
import numpy as np # 原数据生成与二维直方图生成(同前) x1 = np.random.normal(5,5,340) y1 = np.random.normal(5,5,340) x1y1, edgex1, edgey1 = np.histogram2d(x=x1,y=y1, bins=10) # 随机生成x的计数矩阵(每个值在0到原网格计数之间) x_split = np.random.randint(0, x1y1.astype(int)+1, size=x1y1.shape) # y的计数矩阵为原计数减去x的计数 y_split = x1y1.astype(int) - x_split
此时x_split[i,j] + y_split[i,j]完全等于x1y1[i,j],且两个矩阵尺寸与x1y1一致。
内容的提问来源于stack exchange,提问作者Iphy Kelvin
相关产品推荐
相关产品推荐

