2009-11-06 15 views
10

मेरी अपेक्षा के अनुसार निम्न पंक्तियां क्यों काम नहीं करतीं?डबल-कटा हुआ numpy arrays के लिए असाइनमेंट क्यों काम नहीं करता है?

import numpy as np 
a = np.array([0,1,2,1,1]) 
a[a==1][1:] = 3 
print a 
>>> [0 1 2 1 1] 
# I would expect [0 1 2 3 3] 

क्या यह एक 'बग' है या क्या इसका कोई अन्य अनुशंसित तरीका है?

दूसरी ओर, निम्नलिखित काम करता है:

a[a==1] = 3 
print a 
>>> [0 3 2 3 3] 

चीयर्स, फिलिप

उत्तर

7

ऐसा प्रतीत होता है कि आप बस डबल-स्लाइस के माध्यम से असाइनमेंट नहीं कर सकते हैं।

यह हालांकि काम करता है:

a[numpy.where(a==1)[0][1:]] = 3 
4

क्योंकि एक [एक == 1] हिस्सा नहीं वास्तव में एक टुकड़ा है। यह एक नई सरणी बनाता है। जब आप इसके बारे में सोचते हैं तो यह समझ में आता है - आप केवल उन तत्वों को ले रहे हैं जो बुलियन की स्थिति को संतुष्ट करते हैं (फ़िल्टर ऑपरेशन की तरह)।

+0

मैंने एक दूसरा उदाहरण जोड़ा जो मुझे उम्मीद है जैसे काम करता है। मैं वास्तव में अंतर नहीं देखता हूं। असाइनमेंट "माध्यम से पाइप" नहीं होना चाहिए? –

+2

मुझे नहीं लगता कि यह काफी सही है। यदि आप 'a [a == 1] = 3' करते हैं, जो वास्तव में ए की सामग्री को बदलता है। –

+1

@ डेव - मुझे लगता है कि यह पेरिमोसोकोडिया सही है, और यह कि आपका काउंटर-उदाहरण किसी जगह में ऑपरेशन की उपस्थिति बनाने के लिए नुकीले आंतरिक में एक हैक की तरह कुछ और है। – tom10

0

यह तुम क्या चाहते

a[2:][a[2:]==1]=3 
+1

लेकिन इसके लिए पहले से जानने की आवश्यकता है कि 1 की पहली घटना स्थिति 1 पर है। –

10

यह कैसे कल्पना अनुक्रमण काम करता है से संबंधित है नहीं करता है। here पर एक संपूर्ण स्पष्टीकरण है। यह फैंसी इंडेक्सिंग (यानी a[x>3] *= 2) के साथ इनस्थापन संशोधन की अनुमति देने के लिए किया जाता है। इसका एक परिणाम यह है कि आप पाए गए डबल इंडेक्स को असाइन नहीं कर सकते हैं। फैंसी इंडेक्सिंग हमेशा एक दृश्य के बजाय एक प्रतिलिपि देता है।

+0

असल में, आपका समाधान 1 की पहली घटना को संशोधित करता है, जो वह नहीं चाहता है। –

+0

दाएं - आपकी टिप्पणी से पहले इसे हटा दिया। पीएस हाय फिलिप यह रॉबिन है! – robince

+0

हे रॉबिन - यहां मिलने के लिए क्या मौका है ... मुनिच से चीयर्स! –

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