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

Dod*_*dge 0 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")
Run Code Online (Sandbox Code Playgroud)

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

如果我查看文档,我会发现以下内容:

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

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

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


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

Imp*_*est 5

你的猜测是正确的。根据输入plt.subplots()返回一个Axesnumpy多个轴的数组。如果 2D 网格由参数nrowsand定义ncols,则返回的numpy数组也将是 2D 数组。

这种行为在参数内的pyplot.subplots文档中进行了解释squeeze

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

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

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

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

这使得有必要展平这个数组以便能够使用zip它。选项是

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