कुछ साल पहले, पर सक्रिय प्रयोजन व्यंजनों तुलनात्मक उद्देश्यों के लिए, तीन पायथन/न्यूमपी कार्यों; इनमें से प्रत्येक ने एक ही तर्क स्वीकार कर लिया और उसी परिणाम को वापस कर दिया, दूरी मैट्रिक्स।लूपिंग बीट इंडेक्सिंग क्यों यहां है?
इनमें से दो प्रकाशित स्रोतों से लिया गया था; वे दोनों हैं - या वे मुझे - idiomatic numpy कोड होने के लिए दिखाई देते हैं। दूरी मैट्रिक्स बनाने के लिए आवश्यक दोहराव की गणना numpy के सुरुचिपूर्ण इंडेक्स सिंटैक्स द्वारा संचालित होती है। यहाँ उनमें से एक है:
from numpy.matlib import repmat, repeat
def calcDistanceMatrixFastEuclidean(points):
numPoints = len(points)
distMat = sqrt(sum((repmat(points, numPoints, 1) -
repeat(points, numPoints, axis=0))**2, axis=1))
return distMat.reshape((numPoints,numPoints))
तीसरे दूरी मैट्रिक्स बनाया एकल लूप (जो, जाहिर दिया पाशन कि सिर्फ 1,000 2 डी अंक की दूरी मैट्रिक्स, एक लाख प्रविष्टियां हैं की एक बहुत कुछ है) का उपयोग कर। पहली नज़र में इस समारोह ने मुझे उस कोड की तरह देखा जो मैं लिखने के लिए इस्तेमाल करता था जब मैं न्यूम्पी सीख रहा था और मैं पहले पायथन कोड लिखकर न्यूमपी कोड लिखता था और फिर इसे लाइन से लाइन करता था।
सक्रिय राज्य पोस्ट के कई महीनों के बाद, तीनों की तुलना में प्रदर्शन परीक्षणों के परिणाम पोस्ट किए गए और न्यूमपी मेलिंग सूची पर thread में चर्चा की गई।
वास्तव में पाश के साथ समारोह में काफी से बेहतर प्रदर्शन किया अन्य दो:
: सूत्र में
from numpy import mat, zeros, newaxis def calcDistanceMatrixFastEuclidean2(nDimPoints): nDimPoints = array(nDimPoints) n,m = nDimPoints.shape delta = zeros((n,n),'d') for d in xrange(m): data = nDimPoints[:,d] delta += (data - data[:,newaxis])**2 return sqrt(delta)
एक भागीदार (Keir Mierle) एक कारण है कि यह सच हो सकता है की पेशकश की मुझे संदेह है कि यह है कि इसमें बेहतर इलाका है, पर गणना करने से पहले अपेक्षाकृत छोटे काम करने वाले सेट को पूरी तरह से पूरा करने से पहले एक। एक लाइनर संभावित रूप से बड़ी एमएक्सएन सरणी प्रोसेसर में बार-बार खींचना है।
इस पोस्टर के अपने खाते से, उनकी टिप्पणी केवल एक संदेह है, और ऐसा नहीं लगता है कि इस पर चर्चा की गई थी।
इन परिणामों के लिए कैसे खाता है इसके बारे में कोई अन्य विचार?
विशेष रूप से, क्या एक उपयोगी नियम है - लूप और कब सूचकांक के बारे में - जिसे इस उदाहरण से निकाला जा सकता है, numpy code लिखने में मार्गदर्शन के रूप में?
उन लोगों के लिए जो NumPy से परिचित नहीं हैं, या जिन्होंने कोड को नहीं देखा है, यह तुलना किनारे के मामले पर आधारित नहीं है - यह निश्चित रूप से मेरे लिए यह दिलचस्प नहीं होगा। इसके बजाए, इस तुलना में एक ऐसा फ़ंक्शन शामिल है जो मैट्रिक्स गणना में एक सामान्य कार्य करता है (यानी, दो पूर्ववर्ती दिए गए परिणाम सरणी बनाना); इसके अलावा, प्रत्येक कार्य बदले में सबसे आम numpy अंतर्निर्मित के बीच शामिल है।
बहुत उपयोगी, धन्यवाद। मुझसे +1 – doug