संपादित करें मैंने नीचे की जटिल समस्या को नीचे रखा है, लेकिन np.take
के साथ मेरी समस्याएं निम्नानुसार संक्षेप में सारांशित की जा सकती हैं। मान लें कि आपके पास आकार (planes, rows)
का आकार है, और आकार का एक और सरणी lut
है, और आप (planes, rows)
आकार के नए सरणी out
बनाने के लिए उनका उपयोग करना चाहते हैं। यह कल्पना अनुक्रमण के साथ इस प्रकार प्राप्त किया जा सकता:तेजी से फैंसी इंडेक्सिंग के लिए numpy.take का उपयोग
In [4]: %timeit lut[np.arange(planes).reshape(-1, 1), img]
1000 loops, best of 3: 471 us per loop
लेकिन अगर, फैंसी अनुक्रमण के बजाय, आप और लेने का उपयोग planes
बातों पर एक अजगर पाश काफी तेज किया जा सकता है:
In [6]: %timeit for _ in (lut[j].take(img[j]) for j in xrange(planes)) : pass
10000 loops, best of 3: 59 us per loop
कर सकते हैं lut
और img
किसी भी तरह से पुन: व्यवस्थित हो, ताकि पूरा ऑपरेशन पाइथन लूप के बिना हो, लेकिन गति लाभ रखने के लिए परंपरागत फैंसी इंडेक्सिंग के बजाय numpy.take
(या वैकल्पिक विधि) का उपयोग करना?
मूल प्रश्न मैं लुक-अप टेबल (luts) है कि मैं एक छवि पर उपयोग करना चाहते हैं का एक सेट है। एलयूटी धारण करने वाला सरणी (planes, 256, n)
आकार का है, और छवि (planes, rows, cols)
आकार है। दोनों dtype = 'uint8'
हैं, जो LUT के 256
धुरी से मेल खाते हैं। विचार p
n
LUTs के p
LUT के प्रत्येक विमान के माध्यम से छवि के प्रत्येक विमान को p
चलाने के लिए है।
अगर मेरे lut
और img
निम्नलिखित हैं:
planes, rows, cols, n = 3, 4000, 4000, 4
lut = np.random.randint(-2**31, 2**31 - 1,
size=(planes * 256 * n // 4,)).view('uint8')
lut = lut.reshape(planes, 256, n)
img = np.random.randint(-2**31, 2**31 - 1,
size=(planes * rows * cols // 4,)).view('uint8')
img = img.reshape(planes, rows, cols)
मैं प्राप्त कर सकते हैं इस
out = lut[np.arange(planes).reshape(-1, 1, 1), img]
जो मुझे आकार (planes, rows, cols, n)
की एक सरणी देता है, जहां out[i, :, :, j]
की तरह कल्पना अनुक्रमण उपयोग करने के बाद मैं क्या हूँ i
- img
का विमान j
के माध्यम से चलाया गया है- i
- LUT के केंद्र ...
सभी अच्छा है, इस के अलावा:
In [2]: %timeit lut[np.arange(planes).reshape(-1, 1, 1), img]
1 loops, best of 3: 5.65 s per loop
जो पूरी तरह से अस्वीकार्य है, खासकर जब से मैं np.take
का उपयोग कर निम्नलिखित इतना अच्छा नहीं लग रही विकल्प के सभी की तुलना में बहुत तेजी से चलाने के:
एक एकल विमान पर एक एकल LUT लगभग x70 तेज़ चलता है:
In [2]: %timeit np.take(lut[0, :, 0], img[0]) 10 loops, best of 3: 78.5 ms per loop
एक अजगर पाश सभी वांछित संयोजन के माध्यम से चल तेजी से लगभग x6 खत्म:
In [2]: %timeit for _ in (np.take(lut[j, :, k], img[j]) for j in xrange(planes) for k in xrange(n)) : pass 1 loops, best of 3: 947 ms per loop
यहां तक कि lut और छवि में विमानों के सभी संयोजनों चल रहा है और उसके बाद
planes**2 - planes
अवांछित लोगों को त्यागकर फैंसी अनुक्रमण की तुलना में तेजी है:In [2]: %timeit np.take(lut, img, axis=1)[np.arange(planes), np.arange(planes)] 1 loops, best of 3: 3.79 s per loop
और सबसे तेजी से संयोजन मैं साथ आने के लिए सक्षम किया गया है विमानों पर एक अजगर पाश-बार दोहराना है और तेजी से x13 खत्म:
In [2]: %timeit for _ in (np.take(lut[j], img[j], axis=0) for j in xrange(planes)) : pass 1 loops, best of 3: 434 ms per loop
पाठ्यक्रम का सवाल यह है कि np.take
के साथ कोई पाइथन लूप के बिना ऐसा करने का कोई तरीका नहीं है? आदर्श रूप से जो कुछ भी दोबारा बदलना या आकार बदलना आवश्यक है, एलयूटी पर होना चाहिए, छवि नहीं, लेकिन मैं जो कुछ भी लोगों के साथ आ सकता हूं उसके लिए खुला हूं ...
क्या 'अपने स्निपेट में bkpt' है - समझाने की कोई जरूरत नहीं है, मैं सिर्फ मामले में आप अपने मुद्रण की गलती सतर्क करना चाहता हूँ - मुझे लगता है कि यह 'लूट' होना चाहिए? –
... इस पूरे लाइन को 'lut = lut.reshape (विमान, 256, 4)', तो अंतिम मंद में '4' नहीं पढ़ना चाहिए? –
@TheodrosZelleke उनको पकड़ने के लिए धन्यवाद! मेरा 'लूट' वास्तव में एक ** ब्रेकपॉइंट टेबल ** है, इसलिए मेरे कोड में इसे 'बीकेपीटी' कहा जाता है, और जब मैं प्रश्न के लिए * अनुवाद * करता हूं तो मुझे याद आया। – Jaime