2010-08-23 8 views
45

मैं numpy का उपयोग कर रहा हूं और आयाम जानकारी खोए बिना एक पंक्ति को इंडेक्स करना चाहता हूं।आयाम जानकारी खोने के बिना बेवकूफ इंडेक्स टुकड़ा

import numpy as np 
X = np.zeros((100,10)) 
X.shape  # >> (100, 10) 
xslice = X[10,:] 
xslice.shape # >> (10,) 

इस उदाहरण में xslice अब 1 आयाम है, लेकिन मैं इसे (1,10) होना चाहता हूं। आर में, मैं एक्स [10,:, ड्रॉप = एफ] का उपयोग करता हूं। क्या numpy में कुछ समान है। मुझे इसे दस्तावेज में नहीं मिला और मुझे एक समान सवाल नहीं मिला।

धन्यवाद!

उत्तर

29

x[None, 10, :] या समकक्ष (लेकिन अधिक पठनीय) x[np.newaxis, 10, :] करना संभवतः सबसे आसान है।

जहां तक ​​यह डिफ़ॉल्ट नहीं है, व्यक्तिगत रूप से, मुझे लगता है कि सिंगलटन आयामों के साथ लगातार सरणी होने से बहुत जल्दी परेशान हो जाता है। मुझे लगता है कि numpy devs एक ही तरह से महसूस किया।

इसके अलावा, numpy हैंडल प्रसारण सरणी बहुत अच्छी तरह से है, इसलिए टुकड़ा से आया सरणी के आयाम को बनाए रखने के लिए आमतौर पर बहुत कम कारण होता है। यदि आपने किया, तो

a = np.zeros((100,100,10)) 
b = np.zeros(100,10) 
a[0,:,:] = b 

या तो काम नहीं करेगा या लागू करने के लिए और अधिक कठिन होगा।

(या कम से कम उस आयाम की जानकारी जब टुकड़ा करने की क्रिया को छोड़ने के पीछे numpy देव का तर्क पर मेरा अनुमान है)

+4

यह बहुत गलत लगता है ... – sebpiq

+1

दरअसल, 'x [10,:, कोई नहीं]' आकार की एक सरणी देता है '(10,1)', '(1,10)' .. – Lisa

+4

@ लिसा: 'x [कोई नहीं, 10] 'जो भी आप चाहते हैं वह करेगा। – naught101

13

मुझे कुछ उचित समाधान मिले।

1) का उपयोग numpy.take(X,[10],0)

2) आदर्श रूप में यह अजीब अनुक्रमण X[10:11:, :]

उपयोग करते हैं, यह डिफ़ॉल्ट होना चाहिए। मैंने कभी नहीं समझा कि आयाम क्यों गिराए गए हैं। लेकिन यह numpy के लिए एक चर्चा है ...

+0

विकल्प # 2 बहुत बढ़िया है। –

38

एक अन्य समाधान

X[[10],:] 

या

I = array([10]) 
X[I,:] 

की आयामी स्वरूप क्या करना है इंडेक्सिंग की सूची (या सरणी) द्वारा अनुक्रमणित किया जाता है जब एक सरणी संरक्षित होती है। यह अच्छा है क्योंकि यह आपको आयाम और निचोड़ रखने के बीच पसंद के साथ छोड़ देता है।

+5

यह अब तक का सबसे अच्छा समाधान है। – Will

+1

यह सरणी डेटा – Per

+0

प्रतिलिपि बनाता है यह हमेशा ऐसा नहीं होता है। देखें: 'x = np.array ([[1,2,3,4]]) यदि आप इसे 'x [[0], [1,2]] के साथ स्लाइस करते हैं, तो आपको एक आयामी' सरणी मिलती है ' ([2, 3]) 'मेरी राय है जब कॉलम या पंक्ति वैक्टर का चयन करना स्लाइस को सरल बनाना सबसे अच्छा है और फिर' np.reshape' का उपयोग करें, तो मेरे उदाहरण में यह 'np.reshape (x [0, [ 1,2]], [1,2]) ' – Alexander

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