2013-01-21 41 views
17

मुझे अपनी परिणामी सरणी में कुछ पिक्सेल के साथ एक छवि को numpy में पढ़ा है।क्या एक लचीली तालिका को numpy में एक बड़ी सरणी में लागू करने का कोई सुविधाजनक तरीका है?

मैंने 256 मानों के साथ एक लुकअप टेबल की गणना की। अब मैं निम्न कार्य करना चाहते हैं:

for i in image.rows: 
    for j in image.cols: 
     mapped_image[i,j] = lut[image[i,j]] 

हां, यही मूल रूप से क्या एक lut करता है।
केवल समस्या यह है: मैं इसे कुशल बनाना चाहता हूं और उस लूप को उस पायदान में कॉल करना चाहता हूं, जिसके लिए मुझे कुछ सेकंड इंतजार करना होगा।

मुझे numpy.vectorize() पता है, यह केवल एक सुविधा फ़ंक्शन है जो एक ही पायथन कोड को कॉल करता है।

उत्तर

25

तुम बस में lut अगर lut है -1 डी सूचकांक को image उपयोग कर सकते हैं।
यहाँ NumPy में अनुक्रमण पर एक स्टार्टर है:
http://www.scipy.org/Tentative_NumPy_Tutorial#head-864862d3f2bb4c32f04260fac61eb4ef34788c4c

In [54]: lut = np.arange(10) * 10 

In [55]: img = np.random.randint(0,9,size=(3,3)) 

In [56]: lut 
Out[56]: array([ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90]) 

In [57]: img 
Out[57]: 
array([[2, 2, 4], 
     [1, 3, 0], 
     [4, 3, 1]]) 

In [58]: lut[img] 
Out[58]: 
array([[20, 20, 40], 
     [10, 30, 0], 
     [40, 30, 10]]) 

मन भी अनुक्रमण 0

+3

* फेस-डेस्क * यह इतना आसान है, मैं चीख सकता था। मैंने पूरे समय दूसरी दिशा में सोचा और यह काम नहीं करेगा। लेकिन निश्चित रूप से, numpy चीजों को तत्वानुसार करता है, तो यह स्पष्ट समाधान है। शायद मैं कल बहुत थक गया था। ;) – Profpatsch

+0

दरअसल, ऐसा लगता है कि यह बहु-आयामी LUTS के लिए भी काम करता है, कम से कम numpy 1.9.2 – Claude

+0

बहुत ही सुरुचिपूर्ण समाधान, धन्यवाद! – gcucurull

13

सही में TheodrosZelleke के जवाब पर शुरू होता है, लेकिन मैं सिर्फ यह करने के लिए एक छोटे से गैर-दस्तावेजी ज्ञान जोड़ना चाहते थे। Numpy एक समारोह प्रदान करता है, np.take, जो प्रलेखन के अनुसार "फैंसी इंडेक्सिंग जैसा ही है।"

ठीक है, लगभग है, लेकिन से भिन्न:

>>> import numpy as np 
>>> lut = np.arange(256) 
>>> image = np.random.randint(256, size=(5000, 5000)) 
>>> np.all(lut[image] == np.take(lut, image)) 
True 
>>> import timeit 
>>> timeit.timeit('lut[image]', 
...    'from __main__ import lut, image', number=10) 
4.369504285407089 
>>> timeit.timeit('np.take(lut, image)', 
...    'from __main__ import np, lut, image', number=10) 
1.3678052776554637 

np.take 3x के बारे में तेजी से होता है! मेरे अनुभव में, 3 जी लूट का उपयोग आरजीबी से अन्य रंग रिक्त स्थानों में कनवर्ट करने के लिए करते हुए, 3 डी लुक-अप को 1 डी फ्लैटेड लुक-अप में बदलने के लिए तर्क जोड़ना एक एक्स 10 गति को अनुमति देता है।

+1

ओह, वाह, मैं थोड़ी देर के लिए 'np.put' में गहराई से देखा क्योंकि मैंने सोचा कि यह काम कर सकता है। जब मैंने नहीं किया तो मैंने अन्य कार्यों की जांच नहीं की। -.- – Profpatsch

+6

ये समय दो साल पुराने हैं: 1.9 के साथ शुरू होने वाले न्यूमपी के नए संस्करणों में एक बेहतर फैंसी इंडेक्सिंग मशीनरी है, जो अब 'टेक' का उपयोग करने के रूप में तेज़ है। – Jaime