Python 多次运行的矩阵规范化,这段代码做什么?

Python 多次运行的矩阵规范化,这段代码做什么?,python,numpy,matplotlib,matrix,Python,Numpy,Matplotlib,Matrix,我收集了一些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)

我收集了一些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)对每个矩阵进行规格化?或者我用一个唯一的值对它们进行规范化——我甚至需要在这里进行规范化吗?

[:,None]
添加了新的轴,这样您就可以分割每行中所有列的总和——这与使用
np.sum(a,axis=1)[:,np.newaxis]
对所有列进行求和时使用
np.sum(a,axis=1)是一样的
您将获得具有形状
(5000)
的1d数组,但为了能够使用求和列规范化矩阵,您需要具有形状
(5000,1)
的2d数组,这就是需要新轴的原因

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

添加也可能有帮助:

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