2017-10-21 327 views

回答

4

让我们看一个小例子,我们创造了一些轴与plt.subplots,也看this question

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() 

这里,axes是轴的numpy的阵列,

print(type(axes)) 
> <type 'numpy.ndarray'> 
print(axes.shape) 
> (3L, 2L) 

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) 

这将打印数2 3 4 5 6 7

作为阵列上的迭代符,则可以用它来循环在从轴的3×2的阵列中的所有轴,

for i, ax in enumerate(axes.flat): 

对于每次迭代,将来自该阵列产生的下一个坐标轴,使得您可以轻松地在单个循环中绘制所有坐标轴。

另一种方法是使用axes.flatten(),其中flatten()是numpy数组的方法。它不是迭代器,而是返回数组的扁平版本:

for i, ax in enumerate(axes.flatten()): 

从外部看没有区别。但是迭代器实际上并不创建新的数组,因此可能会稍微快一点(尽管这对于matplotlib轴对象来说永远不会显而易见)。

flat1 = [ax for ax in axes.flat] 
flat2 = axes.flatten() 
print(flat1 == flat2) 
> [ True True True True True True] 

迭代轴阵列的扁平版本具有以下优点:你将节省一个环,相对于遍历行和单独列的简单方法,

for row in axes: 
    for ax in row: 
     ax.scatter(...)