为什么在这段代码中需要numpy.ravel()产生小的倍数?

时间:2018-05-21 19:36:26

标签: python numpy matplotlib

我发现了一些生成一组small multiples的代码,它运行正常。

fig, axes = plt.subplots(6,3, figsize=(21,21))
fig.subplots_adjust(hspace=.3, wspace=.175)
for ax, data in zip(axes.ravel(), clean_sets):
    ax.plot(data.ETo, "o")

for ax, data in zip(axes.ravel(), clean_sets):行符合.ravel(),但我不明白这实际上是做什么或为什么有必要。

如果我看一下docs,我会发现以下内容:

  

返回一个连续的扁平数组。

     

返回包含输入元素的1-D数组。只在需要时才制作副本。

我猜对应于来自plt.subplot()的轴的返回是一个无法迭代的多维数组,但实际上我不确定。一个简单的解释将不胜感激。


在这种情况下使用.ravel()的目的是什么?

1 个答案:

答案 0 :(得分:2)

你的猜测是正确的。 plt.subplots()返回Axes或几个轴的numpy数组,取决于输入。如果参数nrowsncols定义了2D网格,则返回的numpy数组也将是一个2D数组。

squeeze参数中的pyplot.subplots documentation

解释了此行为
  

squeeze:bool,optional,默认值:True   如果为True,则从返回的Axes对象中挤出额外的维度:

     
      
  • 如果只构造了一个子图(nrows = ncols = 1),则生成的单个Axes对象将作为标量返回。
  •   
  • 对于Nx1或1xN子图,返回的对象是1D numpy对象数组,Axes对象作为numpy 1D数组返回。
  •   
  • 对于NxM,N> 1且M> 1的子图作为2D阵列返回。
  •   
     

如果为False,则根本不进行压缩:返回的Axes对象始终是包含Axes实例的2D数组,即使它最终为1x1。

由于此处您有plt.subplots(6,3)因此N>1, M>1,因此生成的对象必然是2D数组,与squeeze设置的内容无关。

这使得必须展平此数组才能zip它。选项是

  • zip(axes.ravel())
  • zip(axes.flatten())
  • zip(axes.flat)