2016-04-02 23 views
2

bir 2d veri dizisi data ve iki koordine diziler olması x, y Ben Şimdi herhangi bir levelnumpy analogu?

import numpy as np 
import matplotlib.pyplot as plt 

x, y = np.linspace(0, 2*np.pi), np.linspace(0, 2*np.pi) 
xx, yy = np.meshgrid(x, y) 
data = np.sin(xx) * np.sin(yy) 
level = 0.5 
contour_ = plt.contour(xx, yy, data, levels=[level]) 
plt.show() 

de matplotlib bir kontur arsa sömüren, ben komplo gerçekten ilgileniyor değilim, ama daha ziyade pozisyonunda kontur. Örneğin, konturun x, y etki alanı içinde mi yoksa dışarıda “sızıntı” mı olduğunu görmek istiyorum.

Ben arayarak kontür (x, y) noktaları içeren bir path nesneyi alabilirsiniz

contour_path = contour_.collections[0].get_paths() 

Sorum sadece numpy kullanarak aynı (veya benzer) bilgi almak için standart araçlar olup olmadığıdır, matplotlib modülü olmadan. Çizim yapılmadığından, bu makul olur.

cevap

2

sen Cntr bulabilirsiniz:

from matplotlib._cntr import Cntr 

x, y = np.linspace(0, 2*np.pi), np.linspace(0, 2*np.pi) 
xx, yy = np.meshgrid(x, y) 
data = np.sin(xx) * np.sin(yy) 
level = 0.5 

cntr = Cntr(xx, yy, data) 
res = cntr.trace(level) 

res pathes ve kodlarını içeren bir listedir.

0

Sadece veri alanınız varsa, sınırının bulunduğu yaklaşık bulabilirsiniz;

In [1]: import numpy as np 

In [2]: x, y = np.linspace(0, 2*np.pi), np.linspace(0, 2*np.pi) 

In [3]: xx, yy = np.meshgrid(x, y) 

In [4]: data = np.sin(xx) * np.sin(yy) 

In [5]: scan = np.logical_and(data>0.45, data<0.55) 

In [6]: a, b = scan.shape 

In [7]: for x in range(a): 
     for y in range(b): 
       if scan[x,y]: 
         print('({}, {}),'.format(x,y), end='') 
    ...:    
(4, 10),(4, 11),(4, 12),(4, 13),(4, 14),(4, 15),(5, 7),(5, 8),(5, 9), 
(5, 16),(5, 17),(6, 6),(6, 7),(6, 18),(6, 19),(7, 5),(7, 6),(7, 19), 
(8, 5),(8, 20),(9, 5),(9, 20),(10, 4),(10, 20),(11, 4),(11, 20), 
(12, 4),(12, 20),(13, 4),(13, 20),(14, 4),(14, 20),(15, 4),(15, 20), 
(16, 5),(16, 20),(17, 5),(17, 19),(18, 6),(18, 18),(18, 19),(19, 6), 
(19, 7),(19, 17),(19, 18),(20, 8),(20, 9),(20, 10),(20, 11),(20, 12), 
(20, 13),(20, 14),(20, 15),(20, 16),(29, 33),(29, 34),(29, 35), 
(29, 36),(29, 37),(29, 38),(29, 39),(29, 40),(29, 41),(30, 31), 
(30, 32),(30, 42),(30, 43),(31, 30),(31, 31),(31, 43),(32, 30), 
(32, 44),(33, 29),(33, 44),(34, 29),(34, 45),(35, 29),(35, 45), 
(36, 29),(36, 45),(37, 29),(37, 45),(38, 29),(38, 45),(39, 29), 
(39, 45),(40, 29),(40, 44),(41, 29),(41, 44),(42, 30),(42, 43), 
(42, 44),(43, 30),(43, 31),(43, 42),(43, 43),(44, 32),(44, 33), 
(44, 40),(44, 41),(44, 42),(45, 34),(45, 35),(45, 36),(45, 37), 
(45, 38),(45, 39), 

Tarama aralığını çok küçük yapmak için, pek çok nokta bulamazsınız. Eğer kontur kaynak kodunu okursanız

In [9]: scan2 = np.logical_and(data>0.49, data<0.51) 

In [10]: for x in range(a): 
     for y in range(b): 
       if scan2[x,y]: 
         print('({}, {}),'.format(x,y), end='') 
    ....:    
(4, 12),(5, 17),(7, 19),(9, 20),(12, 4),(17, 5),(19, 7),(20, 9), 
(29, 40),(30, 42),(32, 44),(37, 45),(40, 29),(42, 30),(44, 32), 
(45, 37),