Sas*_*kar 11 python matplotlib
我见过使用matplotlib的各种程序,它们使用axes.flat函数,就像这段代码一样:
for i, ax in enumerate(axes.flat):
Run Code Online (Sandbox Code Playgroud)
这是做什么的?
Imp*_*est 19
让我们看一个最小的例子,我们创建一些轴plt.subplots,也看到这个问题,
import matplotlib.pyplot as plt
fig, axes = plt.subplots(ncols=2,nrows=3, sharex=True, sharey=True)
for i, ax in enumerate(axes.flat):
ax.scatter([i//2+1, i],[i,i//3])
plt.show()
Run Code Online (Sandbox Code Playgroud)
这里axes是一个numpy轴,
print(type(axes))
> <type 'numpy.ndarray'>
print(axes.shape)
> (3L, 2L)
Run Code Online (Sandbox Code Playgroud)
axes.flat它不是一个函数,它是以下属性numpy.ndarray:numpy.ndarray.flat
ndarray.flat数组上的一维迭代器.
这是一个numpy.flatiter实例,它的作用类似于Python的内置迭代器对象,但不是它的子类.
例:
import numpy as np
a = np.array([[2,3],
[4,5],
[6,7]])
for i in a.flat:
print(i)
Run Code Online (Sandbox Code Playgroud)
这将打印数字2 3 4 5 6 7.
作为数组的迭代器,您可以使用它来遍历3x2轴的所有轴,
for i, ax in enumerate(axes.flat):
Run Code Online (Sandbox Code Playgroud)
对于每次迭代,它将从该数组中产生下一个轴,这样您可以轻松地在单个循环中绘制所有轴.
另一种方法是使用axes.flatten(),其中flatten()numpy数组的方法.而不是迭代器,它返回数组的扁平版本:
for i, ax in enumerate(axes.flatten()):
Run Code Online (Sandbox Code Playgroud)
从外面看,两者之间没有区别.然而,迭代器实际上并不创建新数组,因此可能稍微快一点(尽管在matplotlib轴对象的情况下这永远不会是明显的).
flat1 = [ax for ax in axes.flat]
flat2 = axes.flatten()
print(flat1 == flat2)
> [ True True True True True True]
Run Code Online (Sandbox Code Playgroud)
迭代一个扁平版本的轴数组的优点是,与分别迭代行和列的简单方法相比,您将保存一个循环,
for row in axes:
for ax in row:
ax.scatter(...)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10777 次 |
| 最近记录: |