首页 > 解决方案 > 多次运行的矩阵归一化,这段代码有什么作用?

问题描述

我在一段时间内收集了几个 numpy 矩阵。我现在想可视化这些矩阵并探索它们之间的视觉相似性。矩阵包含从 0.0 到 1.0 的小数字。

为了比较它们,我想确保相同的“区域”用相同的颜色着色,例如 0.01 到 0.02 始终是红色,而 0.02 到 0.03 始终是绿色。我有两个问题:

我发现了另一个包含此代码段的问题:

a = np.random.normal(0.0,0.5,size=(5000,10))**2
a = a/np.sum(a,axis=1)[:,None]  # Normalize

plt.pcolor(a)

第二行的效果是什么,正是[:,None]语句。我尝试通过以下方式标准化矩阵:

max_a = a/10# Normalize
print(max_a.shape)
plt.pcolor(max_a)

但与非归一化矩阵的可视化相比,视觉差异不大。然后,当我添加[:,None]语句时,出现错误

ValueError: too many values to unpack (expected 2)

这是预期的,因为现在的形状是10,1,10。因此,我想知道括号的作用以及如何阅读该声明。

其次,相关的,我想确保我可以直观地比较矩阵。因此,我想修复“着色”,例如颜色为绿色或红色时的范围,这样我最终不会在情节 A 中以 0 到 0.1 作为绿色,在情节 B 中以 0 到 0.1 作为红色。我修复了从浮动到颜色的“翻译”?我是否必须用相同的常数(例如 10)对每个矩阵进行归一化?或者我是否用一个独特的值对它们进行规范化——我什至需要在这里进行规范化吗?

标签: pythonnumpymatplotlibmatrix

解决方案


[:,None]添加新轴,因此您可以将每行中所有列的总和相除 - 它与使用相同np.sum(a,axis=1)[:,np.newaxis]- 当您对所有列求和时,np.sum(a,axis=1)您将获得具有 shape 的 1d 数组(5000),但能够使用求和列,您需要形状为 2d 数组(5000,1),这就是需要新轴的原因。

您可以通过固定颜色图的比例来固定颜色:plt.pcolor(max_a,vmin=0,vmax=1)

添加离散颜色条也可能有帮助:

from pylab import cm

cmap = cm.get_cmap('jet', 10)  
plt.pcolor(a,cmap=cmap,vmin=0,vmax=1)
plt.colorbar()

推荐阅读