绘制稀疏矩阵的热图

时间:2017-02-13 18:05:01

标签: python matplotlib scipy sparse-matrix heatmap

我有一个包含直方图的大型稀疏矩阵,我想将其绘制为热图。通常我会简单地绘制完整矩阵(h),如下所示:

import matplotlib.pyplot as plt
plt.imshow(h.T, interpolation="nearest", origin="lower")
plt.colorbar()
plt.savefig("corr.eps")

在这种情况下,我遇到的问题是,整个矩阵的维度189,940x189,940对于我来说太大而无法保留在内存中。我已经发现了关于稀疏模式(例如python matplotlib plot sparse matrix pattern)的帖子,但没有关于如何绘制热图而没有将其转换为密集矩阵的内容。有可能这样做吗? (或者是否有其他方法可以在不耗尽RAM的情况下绘制它?)我的稀疏矩阵目前是一个lilmatrix(scipy.sparse.lil_matrix)。

1 个答案:

答案 0 :(得分:1)

一个想法是使用稀疏操作进行缩减采样。

 data = data.tocsc()       # sparse operations are more efficient on csc
 N, M = data.shape
 s, t = 400, 400           # decimation factors for y and x directions
 T = sparse.csc_matrix((np.ones((M,)), np.arange(M), np.r_[np.arange(0, M, t), M]), (M, (M-1) // t + 1))
 S = sparse.csr_matrix((np.ones((N,)), np.arange(N), np.r_[np.arange(0, N, s), N]), ((N-1) // s + 1, N))
 result = S @ data @ T     # downsample by binning into s x t rectangles
 result = result.todense() # ready for plotting

此代码段实现了一个简单的分箱,但可以进行优化以包含更复杂的过滤器。分箱矩阵只是分箱的id矩阵,例如,如果j // s = i,则S_ij = 1。

更多解释。由于原始矩阵非常大,因此可以对其进行下采样,而输出中没有任何明显的差异。

问题是如何在不首先创建密集表示的情况下进行下采样。一个可能的答案是用矩阵乘法表示分箱,然后使用稀疏矩阵乘法。

因此,如果将右侧的原始数据与分箱矩阵T相乘,则T的列对应于列分箱,特别是T的列数将确定下采样数据在 x 方向上将具有多少像素。 T的每一列确定进入相应bin的内容以及不相应的内容。在示例中,我设置了一些元素,将相邻列(原始矩阵)编码为1,其余列为0。这将这些列与它们相加并将总和放在结果矩阵中,换句话说,它将这些列组合在一起

从左侧乘以完全相同的方式,只影响行而不是列。

如果您认为分箱过于粗糙,则可以使用平滑内核替换简单的零方案,只需确保生成的矩阵保持稀疏。设置这样的矩阵需要更多的努力,但并不困难。您正在为数据使用稀疏矩阵,因此我假设您熟悉如何构造稀疏矩阵。

相关问题