आयाम जानकारी को खोए बिना Numpy सूचकांक टुकड़ा


98

मैं संख्यात्मक उपयोग कर रहा हूं और आयाम जानकारी खोए बिना एक पंक्ति को अनुक्रमित करना चाहता हूं।

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

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

धन्यवाद!

जवाबों:


59

यह शायद करना आसान है x[None, 10, :]या समकक्ष (लेकिन अधिक पठनीय)x[np.newaxis, 10, :]

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

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

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

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

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


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

हाँ। Noneआप जो चॉप कर रहे हैं उसके बगल में अपना एस लगाएं।
मैड फिजिसिस्ट

1
उदाहरण के लिए असाइनमेंट में टपल के लिए अतिरिक्त कोष्ठक गायब है b; यह होना चाहिए b = np.zeros((100,10))
जेरजी

केवल दो के बजाय कुल 3 सूचकांकों का उपयोग करने का क्या कारण है? मेरा मतलब है X[10,None](उदाहरण के रूप में अपने कोड का उपयोग करके)।
ग्रीनोल्डमैन

8
" आमतौर पर सरणी के आयाम को बनाए रखने के लिए बहुत कम कारण है " ... खैर यह निश्चित रूप से, पूरी तरह से, और पूरी तरह से मैट्रिक्स गुणा ( np.matmul()या@ ) को स्क्रू करेगा । बस इसी से जल गया।
जीन-फ्रांकोइस कॉर्बेट

89

एक और उपाय करना है

X[[10],:]

या

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

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


2
यह सरणी डेटा को कॉपी करता है
प्रति

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

1
दूसरों, अंत में एक अर्धविराम के बारे में पता होना - यह महत्वपूर्ण है, X[[10]] रूप में व्याख्या की X[10]जाएगी और आकार छोटा होगा; इसी तरह, X[[10, 20]] == X[10, 20]और आकार भी छोटा है
बेन उस्मान

1
चेतावनी : केवल पूर्णांक अनुक्रमण के साथ अनुक्रमण के इस तरीके को न मिलाएं! यदि आपके पास aआकार था (10, 20, 30), तो आकार a[0, :, [0]]होगा (1, 20), नहीं (20, 1), क्योंकि बाद के अनुक्रमित में प्रसारित किए जाते हैंa[[0], :, [0]] जो अक्सर काफी नहीं होता है जो आप उम्मीद करते हैं! जबकि a[0, :, :1]आप (20, 1)उम्मीद के मुताबिक देंगे । इसके अलावा, एकल सूचकांक के साथ अजीब धार मामले के लिए उपरोक्त टिप्पणी देखें। कुल मिलाकर, ऐसा लगता है कि इस पद्धति में बहुत अधिक किनारे मामले हैं।
बेन उस्मान

30

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

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

2) इस अजीब अनुक्रमण का उपयोग करें X[10:11:, :]

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


1
पायथन सूचियों को अनुक्रमित करते समय 'आयाम' गिराए जाते हैं, alist[0]और उन्हें काटते समय रखा जाता है।
हंपुलज

4
विकल्प 2 (जिसे slice(n, n+1)इंडेक्स निकालने के लिए लिखा जा सकता है n) स्वीकृत उत्तर होना चाहिए, क्योंकि यह एकमात्र ऐसा है जो स्वाभाविक रूप से एन-आयामी मामले तक फैलता है।
norok2

विकल्प 2 को लगता है कि X[10:11, :]पाइथन 3.7.5 के रूप में लिखा जा सकता है (यानी 11 के बाद अतिरिक्त बृहदान्त्र के बिना)
जो

6

यहां एक विकल्प है जो मुझे बेहतर लगता है। एक एकल संख्या के साथ अनुक्रमित करने के बजाय, एक सीमा के साथ सूचकांक। वह है, उपयोग X[10:11,:]। (ध्यान दें कि 10:11इसमें 11 शामिल नहीं हैं)।

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

यह अधिक आयामों के साथ समझने में आसान बनाता है, कोई भी Noneकरतब नहीं है और पता लगाना है कि किस सूचकांक का उपयोग करना है। इसके अलावा, सरणी के आकार के संबंध में अतिरिक्त बहीखाता करने की आवश्यकता नहीं है, बस i:i+1किसी भी चीज के लिए iजिसे आपने नियमित अनुक्रमण में उपयोग किया होगा।

b = np.ones((2, 3, 4))
b.shape # >> (2, 3, 4)
b[1:2,:,:].shape  # >> (1, 3, 4)
b[:, 2:3, :].shape .  # >> (2, 1, 4)


0

यह विशेष रूप से कष्टप्रद है यदि आप एक सरणी द्वारा अनुक्रमण कर रहे हैं जो रनटाइम में 1 हो सकता है। उस मामले के लिए, वहाँ np.ix_:

some_array[np.ix_(row_index,column_index)]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.