2014-03-03 86 views
0

根据先前的问题(here),现在我想绘制一个点到每个显着的栅格值。在我这样做的时刻在等高线图上绘制点

ax.contourf(x, y, z) 
for i in x: 
    for j in y: 
     if significant[i, j]==True: ax.plot(i, j, 'bo') 

这显然是非常糟糕的,因为它非常慢。有这个问题的一些简单(快速)解决方案吗?请注意,x和y不具有相同的长度,我需要x具有可变长度。

+0

我想'[ax.scatter'](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.scatter)会。 –

+0

我已经试过了。它需要len(x)= len(y),所以至少在没有进一步调整的情况下它不起作用。 – Lukas

+0

是'x'和'y'二维数组吗?顺便说一下:每次'significant [i.j] == True'时,绘制'ax.plot(x,y,'bo')'(所有x和y数组)。这是一个错字吗? –

回答

1

你可以做循环只有在显著为真:

for i, j in zip(*np.where(significant)): 
    ax.plot(i, j, 'bo') 

或者,如果X和Y不是人气指数类:

for i, j in zip(*np.where(significant)): 
    ax.plot(x[i], y[j], 'bo') 

np.where会返回一个元组有两个元素,非零元素的第一个和第二个索引。

+0

绝对更优雅,也更快,谢谢。 for循环不适合我,但我必须调整它:对于i,j zip(np.where(重要)[0],np.where(重要)[1]) – Lukas

+0

哪个numpy版本是你在用吗?我已经重新检查过它,它确实有效: significant = np.zeros((5,4),dtype = np.bool); 显着[1,3] =真; 显着[3,2] =真; for i,j in np.where(significant):print i,j – Davidmh

+0

我使用版本1.6.2。如果我想在同一时间运行两个索引,我必须使用zip():a = b = range(5);对于我,zip(a,b)中的j:print i,j。你可以请尝试设置莫尔然后2个值为真,因为对于我来说它也适用,但这只是一个巧合,因为我也跑到指数。 – Lukas