2011-02-26 9 views
11

मुझे एक प्रतिलिपि के बजाय दृश्य देखने के लिए "फैंसी इंडेक्सिंग" (वाई = एक्स [[0, 5, 21]]) प्राप्त करने का एक तरीका है।क्या मुझे निर्दिष्ट इंडेक्स पर एक numpy सरणी का दृश्य मिल सकता है? ("फैंसी इंडेक्सिंग" से एक दृश्य)

मेरे पास एक सरणी है, लेकिन मैं इस सरणी के एक सबसेट (इंडेक्स की सूची द्वारा निर्दिष्ट) के साथ काम करने में सक्षम होना चाहता हूं इस तरह से इस सबसेट में किए गए परिवर्तनों को भी सही जगहों पर रखा जाता है बड़ी सरणी अगर मैं पहले 10 तत्वों के साथ कुछ करना चाहता हूं, तो मैं नियमित स्लाइसिंग वाई = एक्स [0:10] का उपयोग कर सकता हूं। यह बहुत अच्छा काम करता है, क्योंकि नियमित टुकड़ा एक दृश्य देता है। समस्या यह है कि अगर मैं 0:10 नहीं चाहता, लेकिन सूचकांक का मनमाना सेट है।

क्या ऐसा करने का कोई तरीका है?

उत्तर

12

मुझे नहीं लगता कि इसके आसपास एक रास्ता है। मेरी समझ यह है कि 'फैंसी इंडेक्सिंग' हमेशा एक प्रतिलिपि वापस कर देगी।

ii = [0, 5, 21] 
y = x[ii] 
<manipulate y> 
x[ii] = y 
+4

आप को हरा देखभाल करने के लिए की आवश्यकता होगी मुझे इसके लिए एकमात्र चीज जो मैं जोड़ने जा रहा था वह यह था: http://projects.scipy.org/numpy/ticket/224 संकेत दिया कि यह बदलने की संभावना नहीं है। – Paul

+1

ओह अगर इस तरह के असाइनमेंट अनुक्रमित सरणी (x [ii] = y) तब काम करता है जो मुझे लगता है कि मुझे लगता है। – Eskil

+0

@Eskil ऐसा इसलिए है क्योंकि 'x [ii] = y' 'x .__ setitem __ (ii, y)' को आमंत्रित करता है, इसलिए इसमें कोई प्रतिलिपि शामिल नहीं है हालांकि आपने इंडेक्स सरणी का उपयोग किया था। यह सच है कि 'x [ii]' एक प्रतिलिपि देता है लेकिन यह 'x .__ getitem __ (ii) 'का आह्वान करता है और यह एक अलग कहानी है। –

2

तुम सिर्फ कर सकते हैं::

y = x[[0,1,4]] 
func(y) 
x[[0,1,4]] = y 

मुझे नहीं लगता कि मैं सबसे अच्छा समाधान के बारे में सोच सकते हैं y हेरफेर करने के लिए और फिर एक ही कल्पना अनुक्रमित का उपयोग बाद में x के मूल्यों को बदलने के लिए है आप फैंसी इंडेक्सिंग के साथ विचार प्राप्त कर सकते हैं। हो सकता है कि आप ऐसा नहीं करना चाहें, जैसा कि मुझे लगता है कि फैंसी इंडेक्सिंग बहुत धीमी है, इसे एक बार डेटा कॉपी करने के लिए तेज़ होना चाहिए।

0

आप सैद्धांतिक रूप से एक वस्तु है कि एक और सरणी में एक 'कल्पना दृश्य' की भूमिका करता है बना सकते हैं, और मैं इसके लिए उपयोग के मामलों के बहुत सारे के बारे में सोच सकते हैं। समस्या यह है कि ऐसी वस्तु मानक numpy मशीनरी के साथ संगत नहीं होगी। सभी संकलित numpy सी कोड डेटा और सूचकांक के एक आंतरिक उत्पाद के रूप में सुलभ डेटा पर निर्भर करता है। मूल रूप से अलग डेटा लेआउट प्रारूपों के लिए इस कोड को सामान्य बनाना एक बड़ा उपक्रम होगा। इन परियोजनाओं के साथ एक चुनौती लेने की कोशिश कर रहे एक परियोजना के लिए, निरंतर ब्लेज़ देखें।

1

यहाँ एक संभव तरीका, (कुछ वाक्यात्मक चीनी) एक दृश्य होने के लिए एक 'कल्पना दृश्य संदर्भ' का उपयोग करके अंत में स्पष्ट प्रतिलिपि बयानों से परहेज अनुकरण करने के लिए है। आप देखेंगे कि आपके कोड

import contextlib 

@contextlib.contextmanager 
def fancy_index_view(arr, inds): 
    # create copy from fancy inds 
    arr_copy = arr[inds] 

    # yield 'view' (copy) 
    yield arr_copy 

    # after context, save modified data 
    arr[inds] = arr_copy 

अब संदर्भ में सूचकांक सरणी संशोधित नहीं करता है, टुकड़ा

import numpy as np 
foo = np.random.random((22,2)) 
row_inds = [0,5,21] 
barview = foo[row_inds] 
barview[::] = 1 
foo[row_inds] = barview 

प्रतिस्थापित किया जा सकता द्वारा

import numpy as np 
foo = np.random.random((22,2)) 
row_inds = [0,5,21] 
with fancy_index_view(foo, row_inds) as barview: 
    barview[::] = 1 
संबंधित मुद्दे