2012-03-14 9 views
8

क्या किसी फ़ंक्शन से numpy मैट्रिक्स बनाना संभव है? इस मामले में विशेष रूप से कार्य दो वैक्टरों का पूर्ण अंतर है: S[i,j] = abs(A[i] - B[j])। एक न्यूनतम काम कर उदाहरण नियमित अजगर का उपयोग करता है:दो वैक्टरों के अंतर से numpy मैट्रिक्स पॉप्युलेट

import numpy as np 

A = np.array([1,3,6]) 
B = np.array([2,4,6]) 
S = np.zeros((3,3)) 

for i,x in enumerate(A): 
    for j,y in enumerate(B): 
     S[i,j] = abs(x-y) 

देता है:

[[ 1. 3. 5.] 
[ 1. 1. 3.] 
[ 4. 2. 0.]] 

यह एक निर्माण कि तरह दिखता है करने के लिए अच्छा होगा:

def build_matrix(shape, input_function, *args) 

जहां मैं एक पारित कर सकते हैं इसके तर्क के साथ इनपुट फ़ंक्शन और numpy के गति लाभ को बनाए रखें।

+0

यह संभव है। आपने क्या प्रयास किया है – Marcin

+0

@ मार्सिन - जैसा कि सवाल में बताया गया है, मैं अभी मैट्रिक्स को पॉप्युलेट करने के लिए एक सादे पुराने पायथन दृष्टिकोण का उपयोग कर रहा हूं। Numpy के दस्तावेज़ों को देखते हुए सुझाव है कि समारोह 'vectorize' का उपयोग किया जा सकता है, लेकिन मैं अभी भी नहीं देखा कि समारोह से पहले मैट्रिक्स कैसे निर्माण करें। यदि आप मुझे सही दिशा में इंगित कर सकते हैं (दस्तावेज़ीकरण के अनुसार) मैं इसकी सराहना करता हूं! – Hooked

+0

सादे पायथन में यह संभव होना चाहिए। आपने अपना build_matrix फ़ंक्शन बनाने का प्रयास क्यों किया है? निश्चित रूप से आपके पास कुछ है, और यह उम्मीद करने के बजाय कहीं भी अटक गया है कि कोई आपके लिए यह सब लिख देगा। – Marcin

उत्तर

10

मैं numpy के प्रसारण क्षमताओं में देखने की अनुशंसा:

In [6]: np.abs(A[:,np.newaxis] - B) 
Out[6]: 
array([[1, 3, 5], 
     [1, 1, 3], 
     [4, 2, 0]]) 

http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html

तो आप बस अपने समारोह लिख सकता है के रूप में:

In [7]: def build_matrix(func,args): 
    ...:  return func(*args) 
    ...: 

In [8]: def f1(A,B): 
    ...:  return np.abs(A[:,np.newaxis] - B) 
    ...: 

In [9]: build_matrix(f1,(A,B)) 
Out[9]: 
array([[1, 3, 5], 
     [1, 1, 3], 
     [4, 2, 0]]) 

यह भी काफी की तुलना में तेजी से किया जाना चाहिए अपने बड़े सरणी के लिए समाधान।

+0

यह सही है और बड़े एन के लिए _considerable_ लाभ है। मैं प्रसारण में और अधिक देखूंगा, धन्यवाद। – Hooked

+2

अंतर रखने वाले मध्यवर्ती सरणी को बनाने से बचने के लिए ['numpexpr'] (https://code.google.com/p/numexpr/) का उपयोग किया जा सकता है:' c = a [:, none]; परिणाम = numexpr.evaluate ("abs (c - b)") ' – jfs

+0

@ जेएफ। सेबेस्टियन - जो कुछ भी इसके लायक है, उसके लिए यदि आप' numexpr' स्थापित नहीं हैं तो आप पूर्ण मूल्य को स्थानांतरित करके भी इससे बच सकते हैं। यह थोड़ा और वर्बोज़ है, हालांकि: 'सी = ए [:, कोई नहीं]; परिणाम = सी - बी; np.abs (परिणाम, परिणाम) ' –

13

@ जोशएडेल ने जो सुझाव दिया है उसके अतिरिक्त, आप दो एरे के मामले में प्रसारण करने के लिए किसी भी numpy ufunc के outer method का भी उपयोग कर सकते हैं।

इस मामले में, आप बस np.subtract.outer(A, B) (या, इसके बजाय, इसके पूर्ण मूल्य) चाहते हैं।

जबकि कोई भी इस उदाहरण के लिए काफी पठनीय है, कुछ मामलों में प्रसारण अधिक उपयोगी है, जबकि अन्य में यूफुनक विधियों का उपयोग क्लीनर है।

किसी भी तरह से, यह दोनों चाल जानने के लिए उपयोगी है।

उदा।

import numpy as np 

A = np.array([1,3,6]) 
B = np.array([2,4,6]) 

diff = np.subtract.outer(A, B) 
result = np.abs(diff) 

मूल रूप से, आप किसी भी numpy साथ outer, accumulate, reduce, और reduceat उपयोग कर सकते हैं ufunc ऐसे subtract, multiply, divide, या logical_and की तरह भी बातें, आदि

उदाहरण के लिए के रूप में, np.cumsum बराबर है np.add.accumulate पर। इसका मतलब है कि अगर आपको इसकी आवश्यकता भी हो तो cumdivnp.divide.accumulate द्वारा कुछ लागू कर सकते हैं।

+0

धन्यवाद @ जोकिंगटन, क्या आप प्रसारण विधि और बाहरी विधि के बीच कोई आंतरिक अंतर रखते हैं, तो क्या आप जानते हैं? व्यावहारिकता के लिए, मुझे अपनी मशीन पर छोटे परीक्षणों के लिए कोई गति अंतर नहीं दिखता है, इसलिए मुझे लगता है कि मैं या तो एक का उपयोग कर सकता हूं। – Hooked

+0

@ जोकिंगटन +1 निश्चित रूप से किसी की आस्तीन को बनाए रखने के लिए अनगिनत चाल का एक और बड़ा सेट है। कुछ दिनों में मुझे वास्तव में इस दृष्टिकोण को बेहतर पसंद है क्योंकि मुझे सिंटैक्स अधिक वर्णनात्मक लगता है। – JoshAdel

+1

@talonmies 10,100,1000 और 10000 तत्वों के साथ सरणी के लिए मेरी मशीन पर, प्रसारण और बाहरी विधियों में एक ही समय के साथ प्रसारण विधि के साथ एक ही समय है। – JoshAdel

संबंधित मुद्दे