将两个 2D 数据集组合成具有共享比例的单个二维直方图矩阵

Combine two 2D Datasets in single bi-dimensional histogram matrix with shared scale

我有两个数据集 d1,d2 填充了不同比例的二维数据。

import numpy as np
d1 = np.random.normal(-30,20,(500,2))
d2 = np.random.normal(-40,10,(500,2))

此外,我能够从每个单独的数据集创建单独的 100 x 100 二维直方图(=灰度图像)。

bins = [100,100]
h1 = np.histogram2d(d1[:,0], d1[:,1], bins)[0]
h2 = np.histogram2d(d2[:,0], d2[:,1], bins)[0]

但是使用此解决方案,每个 2D 直方图都以其自身的均值为中心,并且当将两个直方图绘制在彼此之上时,它们似乎分布在同一中心周围,这实际上是不正确的。

我想要得到的是一个单一的100 x 100 x 2 historgam矩阵(相当于一个2通道图像),它考虑到了数据的不同尺度,所以位移不会丢失。

如果您传递 histogram2d 一个值 bins=[100, 100],您要求它在每个维度中自动计算 100 个 bin。你可以自己做,所以这两个

bins = [
    np.linspace(x.min(), x.max(), 100),
    np.linspace(y.min(), y.max(), 100)
]
h1 = np.histogram2d(x, y, bins)

bins = [100, 100]
h1 = np.histogram2d(x, y, bins)

是等价的。

知道了,我们现在可以计算两个数组组合的 bin 范围,并使用它们

bins = [
    np.linspace(
        min(d1[:, 0].min(), d2[:, 0].min()),
        max(d1[:, 0].max(), d2[:, 0].max()),
        100
    ),
    np.linspace(
        min(d1[:, 1].min(), d2[:, 1].min()),
        max(d1[:, 1].max(), d2[:, 1].max()),
        100
    )
]
h1 = np.histogram2d(d1[:,0], d1[:,1], bins)
h2 = np.histogram2d(d2[:,0], d2[:,1], bins)

或者将两个数据集叠加在一起,稍微简化一下代码

d = np.stack((d1, d2))

bins = [
    np.linspace(d[..., 0].min(), d[..., 0].max(), 100),
    np.linspace(d[..., 1].min(), d[..., 1].max(), 100),
]

h1 = np.histogram2d(d[0, :, 0], d[0, :, 1], bins)
h2 = np.histogram2d(d[1, :, 0], d[1, :, 1], bins)