In [1]:
>>> nx, ny = (10, 10)
>>> x = np.linspace(0, 1, nx)
>>> y = np.linspace(0, 1, ny)
>>> xv, yv = np.meshgrid(x, y)

In [2]:
points = np.array((xv.flatten(), yv.flatten())).transpose()

In [3]:
>>> from scipy.spatial import Delaunay
>>> tri = Delaunay(points)

In [4]:
>>> import matplotlib.pyplot as plt
>>> plt.triplot(points[:,0], points[:,1], tri.vertices.copy())
>>> plt.plot(points[:,0], points[:,1], 'o')
>>> plt.show()



In [5]:
indices, indptr = tri.vertex_neighbor_vertices
k=0
indptr[indices[k]:indices[k+1]]


Out[5]:
array([11, 10,  1], dtype=int32)

In [6]:
edges = []
for k in xrange(len(points)):
    for p in indptr[indices[k]:indices[k+1]]:
        if p > k:
            edges.append([k, p])
            
print edges


[[0, 11], [0, 10], [0, 1], [1, 11], [1, 2], [2, 13], [2, 3], [2, 12], [2, 11], [3, 13], [3, 4], [4, 13], [4, 14], [4, 15], [4, 5], [5, 15], [5, 6], [6, 16], [6, 7], [6, 15], [7, 18], [7, 8], [7, 17], [7, 16], [8, 18], [8, 19], [8, 9], [9, 19], [10, 11], [10, 20], [11, 20], [11, 21], [11, 12], [12, 23], [12, 22], [12, 13], [12, 21], [13, 14], [13, 23], [14, 23], [14, 24], [14, 15], [15, 25], [15, 24], [15, 16], [15, 26], [16, 17], [16, 27], [16, 26], [17, 18], [17, 27], [18, 27], [18, 28], [18, 19], [19, 28], [19, 29], [20, 31], [20, 30], [20, 21], [21, 31], [21, 22], [22, 23], [22, 32], [22, 31], [23, 32], [23, 33], [23, 34], [23, 24], [24, 25], [24, 34], [25, 34], [25, 35], [25, 36], [25, 26], [26, 27], [26, 36], [27, 28], [27, 36], [27, 37], [27, 38], [28, 38], [28, 29], [29, 38], [29, 39], [30, 31], [30, 40], [31, 40], [31, 41], [31, 42], [31, 32], [32, 33], [32, 42], [32, 43], [33, 34], [33, 43], [34, 35], [34, 44], [34, 43], [35, 36], [35, 45], [35, 44], [36, 37], [36, 45], [36, 46], [36, 47], [37, 38], [37, 47], [38, 39], [38, 49], [38, 48], [38, 47], [39, 49], [40, 51], [40, 50], [40, 41], [41, 51], [41, 42], [41, 52], [42, 52], [42, 43], [43, 52], [43, 53], [43, 44], [43, 54], [44, 45], [44, 54], [45, 56], [45, 55], [45, 46], [45, 54], [46, 56], [46, 47], [47, 48], [47, 57], [47, 56], [47, 58], [48, 59], [48, 49], [48, 58], [49, 59], [50, 51], [50, 60], [51, 60], [51, 61], [51, 52], [52, 61], [52, 62], [52, 63], [52, 53], [53, 63], [53, 54], [54, 65], [54, 55], [54, 64], [54, 63], [55, 66], [55, 65], [55, 56], [56, 66], [56, 57], [57, 66], [57, 67], [57, 58], [57, 68], [58, 69], [58, 59], [58, 68], [59, 69], [60, 71], [60, 70], [60, 61], [61, 71], [61, 62], [62, 71], [62, 72], [62, 73], [62, 63], [63, 73], [63, 64], [64, 73], [64, 74], [64, 75], [64, 65], [65, 66], [65, 75], [66, 77], [66, 67], [66, 76], [66, 75], [67, 77], [67, 68], [67, 78], [68, 69], [68, 78], [69, 78], [69, 79], [70, 71], [70, 80], [71, 80], [71, 81], [71, 72], [71, 82], [72, 82], [72, 73], [73, 82], [73, 83], [73, 74], [73, 84], [74, 84], [74, 75], [75, 76], [75, 84], [75, 85], [75, 86], [76, 77], [76, 86], [77, 86], [77, 87], [77, 78], [78, 89], [78, 79], [78, 88], [78, 87], [79, 89], [80, 91], [80, 90], [80, 81], [81, 91], [81, 82], [82, 91], [82, 92], [82, 93], [82, 83], [83, 93], [83, 84], [84, 93], [84, 94], [84, 95], [84, 85], [85, 95], [85, 86], [86, 87], [86, 97], [86, 96], [86, 95], [87, 88], [87, 97], [88, 98], [88, 99], [88, 89], [88, 97], [89, 99], [90, 91], [91, 92], [92, 93], [93, 94], [94, 95], [95, 96], [96, 97], [97, 98], [98, 99]]

In [9]:
tri.points


Out[9]:
array([[ 0.        ,  0.        ],
       [ 0.11111111,  0.        ],
       [ 0.22222222,  0.        ],
       [ 0.33333333,  0.        ],
       [ 0.44444444,  0.        ],
       [ 0.55555556,  0.        ],
       [ 0.66666667,  0.        ],
       [ 0.77777778,  0.        ],
       [ 0.88888889,  0.        ],
       [ 1.        ,  0.        ],
       [ 0.        ,  0.11111111],
       [ 0.11111111,  0.11111111],
       [ 0.22222222,  0.11111111],
       [ 0.33333333,  0.11111111],
       [ 0.44444444,  0.11111111],
       [ 0.55555556,  0.11111111],
       [ 0.66666667,  0.11111111],
       [ 0.77777778,  0.11111111],
       [ 0.88888889,  0.11111111],
       [ 1.        ,  0.11111111],
       [ 0.        ,  0.22222222],
       [ 0.11111111,  0.22222222],
       [ 0.22222222,  0.22222222],
       [ 0.33333333,  0.22222222],
       [ 0.44444444,  0.22222222],
       [ 0.55555556,  0.22222222],
       [ 0.66666667,  0.22222222],
       [ 0.77777778,  0.22222222],
       [ 0.88888889,  0.22222222],
       [ 1.        ,  0.22222222],
       [ 0.        ,  0.33333333],
       [ 0.11111111,  0.33333333],
       [ 0.22222222,  0.33333333],
       [ 0.33333333,  0.33333333],
       [ 0.44444444,  0.33333333],
       [ 0.55555556,  0.33333333],
       [ 0.66666667,  0.33333333],
       [ 0.77777778,  0.33333333],
       [ 0.88888889,  0.33333333],
       [ 1.        ,  0.33333333],
       [ 0.        ,  0.44444444],
       [ 0.11111111,  0.44444444],
       [ 0.22222222,  0.44444444],
       [ 0.33333333,  0.44444444],
       [ 0.44444444,  0.44444444],
       [ 0.55555556,  0.44444444],
       [ 0.66666667,  0.44444444],
       [ 0.77777778,  0.44444444],
       [ 0.88888889,  0.44444444],
       [ 1.        ,  0.44444444],
       [ 0.        ,  0.55555556],
       [ 0.11111111,  0.55555556],
       [ 0.22222222,  0.55555556],
       [ 0.33333333,  0.55555556],
       [ 0.44444444,  0.55555556],
       [ 0.55555556,  0.55555556],
       [ 0.66666667,  0.55555556],
       [ 0.77777778,  0.55555556],
       [ 0.88888889,  0.55555556],
       [ 1.        ,  0.55555556],
       [ 0.        ,  0.66666667],
       [ 0.11111111,  0.66666667],
       [ 0.22222222,  0.66666667],
       [ 0.33333333,  0.66666667],
       [ 0.44444444,  0.66666667],
       [ 0.55555556,  0.66666667],
       [ 0.66666667,  0.66666667],
       [ 0.77777778,  0.66666667],
       [ 0.88888889,  0.66666667],
       [ 1.        ,  0.66666667],
       [ 0.        ,  0.77777778],
       [ 0.11111111,  0.77777778],
       [ 0.22222222,  0.77777778],
       [ 0.33333333,  0.77777778],
       [ 0.44444444,  0.77777778],
       [ 0.55555556,  0.77777778],
       [ 0.66666667,  0.77777778],
       [ 0.77777778,  0.77777778],
       [ 0.88888889,  0.77777778],
       [ 1.        ,  0.77777778],
       [ 0.        ,  0.88888889],
       [ 0.11111111,  0.88888889],
       [ 0.22222222,  0.88888889],
       [ 0.33333333,  0.88888889],
       [ 0.44444444,  0.88888889],
       [ 0.55555556,  0.88888889],
       [ 0.66666667,  0.88888889],
       [ 0.77777778,  0.88888889],
       [ 0.88888889,  0.88888889],
       [ 1.        ,  0.88888889],
       [ 0.        ,  1.        ],
       [ 0.11111111,  1.        ],
       [ 0.22222222,  1.        ],
       [ 0.33333333,  1.        ],
       [ 0.44444444,  1.        ],
       [ 0.55555556,  1.        ],
       [ 0.66666667,  1.        ],
       [ 0.77777778,  1.        ],
       [ 0.88888889,  1.        ],
       [ 1.        ,  1.        ]])

In [4]:
from scipy.spatial import Delaunay
import numpy as np

def refine_contour_plot(points, values):
    """

    Take a set of `points` and `values` used to plot a contour plot and returns new points to calculate in order of how the value difference between connecting points is reduced.

    >>> refine_contour_plot([[0, 0], [1, 0], [0, 1]], [0., 1., 10.])
    [[0., 0.5], [0.5, 0.5], [0.5, 0.]]

    :Parameters:
      - `points`: Set of (x, y) points.
      - `values`: Values at the points

    :Returns:

      - `new_points`: set of points to recalculate and improve the contour plot

    """
    tri = Delaunay(points)  
    indices, indptr = tri.vertex_neighbor_vertices
    edges = []
    for i in xrange(len(points)):
        for j in indptr[indices[i]:indices[i + 1]]:
            if j > i:
                edges.append([i, j])
    edges = np.array(edges)
    vertexValues = np.array(values)[edges]
    edgeValue = abs(vertexValues[:,0] - vertexValues[:,1])
    
    return ((tri.points[edges[:,0],:] + tri.points[edges[:,1],:]) / 2)[np.argsort(edgeValue)][::-1]

In [42]:
refine_contour_plot([[0, 0], [1, 0], [0, 1]], [0., 1., 10.])


Out[42]:
array([[ 0. ,  0.5],
       [ 0.5,  0.5],
       [ 0.5,  0. ]])

In [1]:
def func(x, y):
    return x**2 * y**2

x = np.linspace(0, 1, 1000)
y = np.linspace(0, 1, 1000)
xv, yv = np.meshgrid(x, y)
answer = func(xv, yv)

plt.contourf(x, y, answer)


Out[1]:
<matplotlib.contour.QuadContourSet instance at 0x4205290>

In [2]:
from matplotlib.mlab import griddata

def interpolate_values(points, values):
    xi = np.linspace(0, 1, 1000)
    yi = np.linspace(0, 1, 1000)

    x = points[:,0]
    y = points[:,1]
    
    return xi, yi, griddata(x, y, values, xi, yi)

In [17]:
points = np.array([[0., 0.], [1., 0.], [0., 1.], [1., 1.]])
values = func(points[:,0], points[:,1])
N = 100
for refine_count in xrange(50):
    xi, yi, valuesi = interpolate_values(points, values)
    #diff = ((answer - valuesi) / np.maximum(1e-10, answer)).flatten()
    diff = (answer - valuesi).flatten()
    error1 = max(abs(diff))
    error2 = np.sqrt(np.sum(diff**2))
    print 'refinement level:',refine_count
    print 'norm inf:',error1
    print 'norm 2:',error2
    tri = Delaunay(points)  
    fig = plt.figure(figsize=(10,3))
    ax1 = fig.add_subplot(1, 3, 1)
    ax1.contourf(xi, yi, valuesi)
    ax2 = fig.add_subplot(1, 3, 3)
    ax2.triplot(points[:,0], points[:,1], tri.vertices.copy())
    ax3 = fig.add_subplot(1, 3, 2)
    ax3.contourf(xi, yi, answer)

    new_points = refine_contour_plot(points, values)
    if len(new_points) >= N:
        new_points = new_points[:N]
    points = np.concatenate((points, new_points))
    values = func(points[:,0], points[:,1])
    
    plt.show()


refinement level: 0
norm inf: 0.25
norm 2: 161.53083125
refinement level: 1
norm inf: 0.0808119774652
norm 2: 36.8173334994
refinement level: 2
norm inf: 0.0246398255006
norm 2: 9.02141362581
refinement level: 3
norm inf: 0.00691176919286
norm 2: 2.24958998696
refinement level: 4
norm inf: 0.00390605821036
norm 2: 1.00404413314
refinement level: 5
norm inf: 0.00390605821036
norm 2: 0.877167980231
refinement level: 6
norm inf: 0.00390605821036
norm 2: 0.850248789567
refinement level: 7
norm inf: 0.00390605821036
norm 2: 0.841684503669
refinement level: 8
norm inf: 0.00390605821036
norm 2: 0.82260761108
refinement level: 9
norm inf: 0.00390605821036
norm 2: 0.806333921917
refinement level: 10
norm inf: 0.00390605821036
norm 2: 0.801550185856
refinement level: 11
norm inf: 0.00390605821036
norm 2: 0.798610317786
refinement level: 12
norm inf: 0.00390605821036
norm 2: 0.79508471496
refinement level: 13
norm inf: 0.00390605821036
norm 2: 0.791629149421
refinement level: 14
norm inf: 0.00390605821036
norm 2: 0.789539263322
refinement level: 15
norm inf: 0.00390605821036
norm 2: 0.776189189872
refinement level: 16
norm inf: 0.00390605821036
norm 2: 0.773428604766
refinement level: 17
norm inf: 0.00390605821036
norm 2: 0.773125916325
refinement level: 18
norm inf: 0.00390605821036
norm 2: 0.769897462918
refinement level: 19
norm inf: 0.00390605821036
norm 2: 0.768573106678
refinement level: 20
norm inf: 0.00390605821036
norm 2: 0.766352264837
refinement level: 21
norm inf: 0.00390605821036
norm 2: 0.759814147175
refinement level: 22
norm inf: 0.00390605821036
norm 2: 0.754259978443
refinement level: 23
norm inf: 0.00390605821036
norm 2: 0.753294079853
refinement level: 24
norm inf: 0.00390605821036
norm 2: 0.751847480348
refinement level: 25
norm inf: 0.00390605821036
norm 2: 0.73250899795
refinement level: 26
norm inf: 0.00390605821036
norm 2: 0.731641650193
refinement level: 27
norm inf: 0.00390605821036
norm 2: 0.728931537737
refinement level: 28
norm inf: 0.00390605821036
norm 2: 0.729777773516
refinement level: 29
norm inf: 0.00390605821036
norm 2: 0.72931347873
refinement level: 30
norm inf: 0.00390605821036
norm 2: 0.716849604432
refinement level: 31
norm inf: 0.00390605821036
norm 2: 0.713989732024
refinement level: 32
norm inf: 0.00390605821036
norm 2: 0.713796866486
refinement level: 33
norm inf: 0.00390605821036
norm 2: 0.71426398419
refinement level: 34
norm inf: 0.00390605821036
norm 2: 0.71260437857
refinement level: 35
norm inf: 0.00390605821036
norm 2: 0.712519634976
refinement level: 36
norm inf: 0.00390605821036
norm 2: 0.711373049433
refinement level: 37
norm inf: 0.00390605821036
norm 2: 0.710962887064
refinement level: 38
norm inf: 0.00390605821036
norm 2: 0.710653438377
refinement level: 39
norm inf: 0.00390605821036
norm 2: 0.710608500303
refinement level: 40
norm inf: 0.00269721304791
norm 2: 0.559547590481
refinement level: 41
norm inf: 0.00270009437705
norm 2: 0.553052947257
refinement level: 42
norm inf: 0.00270009437705
norm 2: 0.550234411876
refinement level: 43
norm inf: 0.00270009437705
norm 2: 0.549562151026
refinement level: 44
norm inf: 0.00270009437705
norm 2: 0.549418558605
refinement level: 45
norm inf: 0.00275998829672
norm 2: 0.549660437718
refinement level: 46
norm inf: 0.00275998829672
norm 2: 0.549437189663
refinement level: 47
norm inf: 0.00275998829672
norm 2: 0.54940514805
refinement level: 48
norm inf: 0.00275998829672
norm 2: 0.547533378536
refinement level: 49
norm inf: 0.00275998829672
norm 2: 0.547195969899

In [ ]:


In [ ]:


In [ ]: