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

Python 为什么在生成小倍数的代码中需要numpy.ravel()?,python,numpy,matplotlib,Python,Numpy,Matplotlib,我找到了一些代码来生成一组,它工作得非常好 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") ax的行,zip中的数据(axes.ravel(),clean_set):contians.ravel(

我找到了一些代码来生成一组,它工作得非常好

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")
ax的行
,zip中的数据(axes.ravel(),clean_set):
contians
.ravel()
,但我不明白这到底在做什么,也不明白为什么有必要这样做

如果我看一下,我会发现:

返回一个连续的展开数组

返回一个包含输入元素的一维数组。只有在需要时才制作副本

我猜与
plt.subplot()
中的轴对应的返回是一个无法迭代的多维数组,但我真的不确定。如能简单解释,将不胜感激



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

您的猜测是正确的
plt.subplot()
根据输入返回多个轴的
Axes
numpy
数组。如果二维网格由参数
nrows
ncols
定义,则返回的
numpy
数组也将是二维数组

此行为在
挤压
参数内部解释

挤压
:bool,可选,默认值:True
如果为True,则会从返回的轴对象中挤出额外的尺寸:

  • 如果只构造了一个子地块(nrows=ncols=1),则生成的单轴对象将作为标量返回
  • 对于Nx1或1xN子批次,返回的对象是一个1D numpy对象数组,轴对象作为numpy 1D数组返回
  • 对于NxM,N>1和M>1的子批次作为2D数组返回
如果为False,则根本不进行压缩:返回的Axes对象始终是包含Axes实例的2D数组,即使它最终是1x1

由于这里有
plt.子图(6,3)
,因此
N>1,M>1
,结果对象必然是一个2D数组,与
挤压
的设置无关

这使得有必要展平此阵列,以便能够
zip
。选择是

  • zip(axes.ravel())
  • zip(axes.flatte())
  • zip(轴平)

    • 你的猜测是正确的
      plt.subplot()
      根据输入返回多个轴的
      Axes
      numpy
      数组。如果二维网格由参数
      nrows
      ncols
      定义,则返回的
      numpy
      数组也将是二维数组

      此行为在
      挤压
      参数内部解释

      挤压
      :bool,可选,默认值:True
      如果为True,则会从返回的轴对象中挤出额外的尺寸:

      • 如果只构造了一个子地块(nrows=ncols=1),则生成的单轴对象将作为标量返回
      • 对于Nx1或1xN子批次,返回的对象是一个1D numpy对象数组,轴对象作为numpy 1D数组返回
      • 对于NxM,N>1和M>1的子批次作为2D数组返回
      如果为False,则根本不进行压缩:返回的Axes对象始终是包含Axes实例的2D数组,即使它最终是1x1

      由于这里有
      plt.子图(6,3)
      ,因此
      N>1,M>1
      ,结果对象必然是一个2D数组,与
      挤压
      的设置无关

      这使得有必要展平此阵列,以便能够
      zip
      。选择是

      • zip(axes.ravel())
      • zip(axes.flatte())
      • zip(轴平)

      您正在创建6行3列的
      以在图形中绘图。我相信
      clean_set
      具有要在每个轴上绘图的数据。我相信
      len(干净的套装)
      18岁。现在要在每个轴上绘制所有18个集。但是axes.shape是
      (6,3)
      。也就是说,如果您想访问第10个
      轴来绘制第10个
      清洁集
      ,您必须访问轴[1][3],但使用
      axes.ravel()
      ,它是
      axes.ravel()[9]
      。现在的绑定是线性的。换句话说,从轴的n*n矩阵现在,你有了轴的1-d数组。你正在创建6行3列的
      来在你的图形中绘图。我相信
      clean_set
      有你想要在每个轴上绘图的数据。我相信
      len(干净的套装)
      18岁。现在要在每个轴上绘制所有18个集。但是axes.shape是
      (6,3)
      。也就是说,如果您想访问第10个
      轴来绘制第10个
      清洁集
      ,您必须访问轴[1][3],但使用
      axes.ravel()
      ,它是
      axes.ravel()[9]
      。现在的绑定是线性的。换句话说,从轴的n*n矩阵现在,你有了轴的一维数组。