मैं scipy.spatial.Delaunay.convex_hull से क्या मिलता है

मैंने सोचा कि scipy.spatial.Delaunay.convex_hull एक सरणी लौट रहा है जहां हर बिंदु/अनुक्रमणिका का उपयोग दो बार होता है, क्योंकि एक बिंदु दो किनारों से संबंधित होता है। लेकिन मेरे मामले में केवल एक बार कई सूचकांक हैं:

hull = [[5053 6943]
        [6219 5797]
        [3441 5797]
        [7547 1405]
        [3441 6547]
        [8144 9215]
        [  47  444]
        [ 444 6219]
        [6547 5053]
        [9945 6943]
        [2695 1405]]

उदाहरण के लिए "47" केवल एक बार उपयोग किया जाता है। इसका क्या अर्थ है (ज्यामितीय रूप से)? एक उत्तल हॉल का एक बिंदु केवल एक किनारे के लिए उपयोग किया जा सकता है?

0
Delaunay.convex_hull में त्रिभुज किनार होते हैं जो Qhull को पड़ोसी नहीं होने की रिपोर्ट करता है। यदि त्रिभुज में अपरिवर्तनीय त्रिकोण होते हैं, तो इस सेट में कलाकृतियों को शामिल किया जा सकता है। यदि आप संख्यात्मक रूप से स्थिर उत्तल हल प्राप्त करना चाहते हैं, तो scipy.spatial.ConvexHull का उपयोग करें।
जोड़ा लेखक pv., स्रोत

1 उत्तर

जैसा ऊपर बताया गया है, आपको नए scipy.spatial.ConvexHull का उपयोग करना चाहिए। यदि आप नीचे दिए गए मेरे आईपीथन उदाहरणों में इस विधि से लौटाए गए शिखर के सूचकांक देखते हैं, तो आप देखेंगे कि वे 2 डी या 3 डी डेटा सेट के लिए सामान्य रूप से अनावश्यक नहीं हैं।

%pylab inline
import numpy
#use a simple trianglular data set:
triangle_points = numpy.array([[0,0],[-1,1],[1,1]])

#plot the triangle:
fig = plt.figure()
ax = fig.add_subplot(111,aspect='equal')
ax.scatter(triangle_points[...,0],triangle_points[...,1])

enter image description here

#now calculate the convex hull of the triangular point set:
import scipy, scipy.spatial
convex_hull_2D = scipy.spatial.ConvexHull(triangle_points)
#determine the indices of the vertices forming the convex hull (i.e., the output you get with the older scipy version):
convex_hull_vertex_indices = convex_hull_2D.vertices
#print the array of convex hull vertex indices:
convex_hull_vertex_indices
array([2, 1, 0], dtype=int32) #output

#For this simple 2D data set it is clear that scipy can define a convex hull using the index of each input point only once, so it is not doing AB, BC, CA as you might initially guess

#Let's see what happens if we add a point outside the plane of the triangle and make the data set 3D:
tetrahedral_points = numpy.array([[0,0,0],[-1,1,0],[1,1,0],[0,0.5,3]]) #the last element is the 'out of plane' new point
convex_hull = scipy.spatial.ConvexHull(tetrahedral_points)
convex_hull_vertex_indices = convex_hull.vertices
convex_hull_vertex_indices
array([0, 1, 2, 3], dtype=int32) #output  

#again, for a simple shape, even in 3D, scipy specifies the indices of the vertices of the convex hull in a non-redundant manner

#take a look at the simplices of the 2D ConvexHull object:
convex_hull_simplices = convex_hull_2D.simplices
convex_hull_simplices
array([[2, 1],
       [0, 1],
       [0, 2]], dtype=int32) #output

#so the simplices do contain duplicate indices to connect points to form edges/1-simplices
fig = plt.figure()
ax = fig.add_subplot(111,aspect='equal')
ax.set_ylim(0,1.2)
edge_colors = ['blue','red','green'] #color each 1-simplex differently for clarity
for simplex, edge_color in zip(convex_hull_simplices,edge_colors):
    plt.plot(triangle_points[simplex,0], triangle_points[simplex,1], c=edge_color)

enter image description here

0
जोड़ा
अच्छा लगता है, लेकिन मुझे एक त्रुटि मिलती है और पता नहीं क्यों: scipy.spatial आयात से ConvexHull आयात numpy working_points = numpy.array ([[0,0], [- 1,1], [1,1 ]]) conv_hull = ConvexHull (working_points) conv_hull_vert = conv_hull.vertices मुझे मिलता है: विशेषता त्रुटि: 'ConvexHull' ऑब्जेक्ट में कोई विशेषता 'vertices' नहीं है
जोड़ा लेखक Munchkin, स्रोत
धन्यवाद। मुझे पता है कि मेरे पास संस्करण 0.12.0 है, लेकिन मैं इसे एटीएम का परीक्षण नहीं कर सकता, बाद में कोशिश करूंगा। लेकिन मेरे पास एक आखिरी सवाल भी है: 2 कोड में ConvexHull ()। Vertices और ConvexHull ()। सरलीकरण के बीच क्या अंतर है?
जोड़ा लेखक Munchkin, स्रोत
यह मेरे लिए काम करता है - आपको एक अधिक हालिया संस्करण का उपयोग करना पड़ सकता है क्योंकि ConvexHull का यह संस्करण हाल ही में है (जब आपकी टिप्पणी में कोड काम करता है तो मैं 0.13.0 का उपयोग करता हूं)। मुझे लगता है कि पाइप का उपयोग करने के साथ स्थापित scipy संस्करण को समायोजित करने का सबसे आसान तरीका है: pip install 'scipy == 0.13.0' फिर आयात scipy scipy .__ version__ यह सुनिश्चित करने के लिए कि पाइथन सही संस्करण तक पहुंच रहा है।
जोड़ा लेखक treddy, स्रोत
मैंने अब सरलताओं के साथ एक उदाहरण भी शामिल किया है। आप देख सकते हैं कि यहां डुप्लिकेट इंडेक्स हैं क्योंकि ये किनारों को उचित हैं। यह मानक दस्तावेज में कुछ हद तक भी वर्णित है: docs.scipy.org/doc/scipy-dev/reference/generated/…
जोड़ा लेखक treddy, स्रोत