2013-06-15 9 views
6

मैं NxMx3, जहां तीन तत्वों का एक वेक्टर मूल प्रविष्टि की एक समारोह है करने के लिए NxM से एक numpy.array नक्शा चाहते की एक सरणी में सरणी जैसे numpy.vectorize आयामों को बदलने की अनुमति नहीं देते हैं। निश्चित रूप से, मैं शून्यों की एक सरणी बना सकता हूं और एक लूप (and it is what I am doing by now) बना सकता हूं, लेकिन यह न तो पाइथोनिक और न ही कुशल (पाइथन में प्रत्येक लूपिंग) के रूप में नहीं लगता है।मानचित्रण तत्व के लिहाज से एक NumPy अधिक आयाम

क्या प्रत्येक प्रविष्टि के लिए एक वेक्टर का उत्पादन, numpy.array पर एक तत्ववार ऑपरेशन करने का कोई बेहतर तरीका है?

+0

यदि 'एन' और' एम' 3 से काफी बड़े हैं, तो तीसरे आयाम पर लूपिंग प्रदर्शन पर एक महत्वहीन प्रभाव डालेगा। और loops के लिए उपयोग में un-pythonic कुछ भी नहीं है! 'Np.vectorize' का उपयोग कर बहुत numpythonic या कुशल नहीं है। आप 'f1',' f2' और 'f3' को एक ही फ़ंक्शन में कनवर्ट करने का प्रयास कर सकते हैं जो सरणी और लौटाए गए सरणी लेता है। यह जानने के बिना कि आपके कार्य क्या कर रहे हैं, यह जानना संभव नहीं है कि यह दृष्टिकोण आपकी समस्या के अनुरूप होगा या नहीं। – Jaime

+0

@ जैम मैं एन और एम पर लूपिंग कर रहा हूं, नहीं 3. समस्या तीन फ्लोट्स [आर, जी, बी] में जटिल संख्याओं का रूपांतरण है, इसलिए मैं एक जटिल कार्य साजिश कर सकता हूं (प्रश्न में लिंक देखें)। –

उत्तर

3

अब जब कि मैं देख रहा हूँ अपने कोड, सबसे सरल गणितीय क्रियाओं के लिए आप numpy पाशन करते हैं कर सकते हैं, जिसे अक्सर वेक्टरलाइजेशन:

def complex_array_to_rgb(X, theme='dark', rmax=None): 
    '''Takes an array of complex number and converts it to an array of [r, g, b], 
    where phase gives hue and saturaton/value are given by the absolute value. 
    Especially for use with imshow for complex plots.''' 
    absmax = rmax or np.abs(X).max() 
    Y = np.zeros(X.shape + (3,), dtype='float') 
    Y[..., 0] = np.angle(X)/(2 * pi) % 1 
    if theme == 'light': 
     Y[..., 1] = np.clip(np.abs(X)/absmax, 0, 1) 
     Y[..., 2] = 1 
    elif theme == 'dark': 
     Y[..., 1] = 1 
     Y[..., 2] = np.clip(np.abs(X)/absmax, 0, 1) 
    Y = matplotlib.colors.hsv_to_rgb(Y) 
    return Y 
के रूप में जाना जाता है

यह कोड आपके से बहुत तेज़ चलना चाहिए।

+0

मुझे नहीं पता था कि उपशीर्षक को 'वाई [..., i] 'या' वाई [i, ...] 'के रूप में संदर्भित करना संभव है। धन्यवाद! क्या इस ऑपरेशन के लिए कोई विशेष नाम है? (मैं * vectorization * googling था, लेकिन यह 'np.vectorize' जैसी चीजें देता है।) –

+1

यह _ellipsis_ नोटेशन है। टाइपो को सही किया। – Jaime

+0

मैं देखता हूं। अब मैं इस पर कुछ नोट्स देखता हूं: http://stackoverflow.com/a/773472/907575 और http://stackoverflow.com/questions/118370/how-do-you-use-the-ellipsis-slicing-syntax- इन-अजगर। –

4

अगर मैं आपकी समस्या को सही ढंग से समझ, मैं सुझाव है कि आप np.dstack का उपयोग करें:

Docstring: 
Stack arrays in sequence depth wise (along third axis). 

Takes a sequence of arrays and stack them along the third axis 
to make a single array. Rebuilds arrays divided by `dsplit`. 
This is a simple way to stack 2D arrays (images) into a single 
3D array for processing. 

In [1]: a = np.arange(9).reshape(3, 3) 

    In [2]: a 
    Out[2]: 
    array([[0, 1, 2], 
      [3, 4, 5], 
      [6, 7, 8]]) 

    In [3]: x, y, z = a*1, a*2, a*3 # in your case f1(a), f2(a), f3(a) 

    In [4]: np.dstack((x, y, z)) 
    Out[4]: 
    array([[[ 0, 0, 0], 
      [ 1, 2, 3], 
      [ 2, 4, 6]], 

      [[ 3, 6, 9], 
      [ 4, 8, 12], 
      [ 5, 10, 15]], 

      [[ 6, 12, 18], 
      [ 7, 14, 21], 
      [ 8, 16, 24]]]) 
+0

मैं स्मृति को बचाने के लिए 'x, y, z' को परिभाषित करने से बचूंगा,' np.dstack() ' –

+0

@sgpc के अंदर फ़ंक्शंस को कॉल करना - आप सही हैं। मैंने केवल यह स्पष्टता के लिए किया था। – root

+0

+1 अच्छा और काम करता है। मैंने जैम के जवाब को स्वीकार कर लिया क्योंकि यह मेरे उद्देश्य और कुछ सामान्यीकरण के लिए अधिक सुविधाजनक है। –

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