numpy

2016-04-30 7 views
9

में मानक पाश करने के लिए vectorized कोड के साथ अलग परिणाम मैं निम्नलिखित दो कार्य किया है:numpy

def loop(x): 
    a = np.zeros(10) 
    for i1 in range(10): 
     for i2 in range(10): 
      a[i1] += np.sin(x[i2] - x[i1]) 
    return a 

और

def vectorized(x):  
    b = np.zeros(10) 
    for i1 in range(10): 
     b += np.sin(np.roll(x, i1) - x) 
    return b 
हालांकि

, जब मैं दोनों चलाने के लिए, मुझे लगता है कि उनके परिणामों थोड़ा भिन्न होते हैं:

x = np.arange(10) 
a, b = loop(x), vectorized(x) 
print b - a 

मैं:

[ 2.22044605e-16 0.00000000e+00 0.00000000e+00 6.66133815e-16 
    -2.22044605e-16 2.22044605e-16 0.00000000e+00 2.22044605e-16 
    2.22044605e-16 2.22044605e-16] 

जो बहुत छोटा है, लेकिन मेरे मामले में, सिमुलेशन को प्रभावित करता है। यदि मैं कार्यों से np.sin को हटा देता हूं, तो अंतर गायब हो जाता है। वैकल्पिक रूप से भिन्नता भी दूर हो जाती है यदि एक्स के लिए np.float32 का उपयोग करें, लेकिन यह एक ओडीई का हिस्सा है जिसे एक सॉल्वर द्वारा हल किया जा रहा है जो फ्लोट 64 का उपयोग करता है। क्या इस अंतर को हल करने का कोई तरीका है?

+10

दुर्भाग्य से, जब आप आपरेशनों को पुन: व्यवस्थित की तरह आप किया है, यह मुश्किल (? असंभव) से त्रुटि गोलाई के आदेश पर मतभेद रखने के लिए में प्रवेश। यदि अंतिम समाधान में वास्तव में महत्वपूर्ण अंतर हैं, तो आपको खुद से पूछना शुरू करना होगा कि आपको कम संवेदनशील ओडीई सॉल्वर चुनना है (या यदि आप जिस प्रणाली को हल करने की कोशिश कर रहे हैं, वह अराजक व्यवहार प्रदर्शित करता है जो कुछ प्रकार के मॉडलिंग को असंभव बनाता है) – mgilson

उत्तर

6

ऐसा इसलिए है क्योंकि आप एक ही क्रम में ऑपरेशन नहीं करते हैं।

बराबर पूरी तरह से सवार समाधान के लिए, c=sin(add.outer(x,-x))).sum(axis=0) करें।

In [8]: (c==loop(x)).all() 
Out[8]: True 

और तुम vectorisation से भरा avantage जीत:

In [9]: %timeit loop(x) 
1000 loops, best of 3: 750 µs per loop 

In [10]: %timeit vectorized(x) 
1000 loops, best of 3: 347 µs per loop 

In [11]: %timeit sin(x[:,None]-x).sum(axis=0) 
10000 loops, best of 3: 46 µs per loop 

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