2012-06-12 14 views
110

मैं कुछ विशिष्ट तत्वों को एक numpy सरणी से कैसे हटा सकता हूं? मैंएक numpy सरणी में विशिष्ट तत्वों को कैसे निकालें

import numpy as np 

a = np.array([1,2,3,4,5,6,7,8,9]) 

है कहते हैं कि मैं तो a से 3,4,7 निकालना चाहते हैं। मुझे पता है कि मूल्यों की अनुक्रमणिका (index=[2,3,6]) है।

उत्तर

160

उपयोग numpy.delete() - उप सरणियों के साथ एक नई सरणी रिटर्न के साथ एक धुरी नष्ट कर दिया

numpy.delete(a, index) 

अपने विशिष्ट प्रश्न के लिए:

import numpy as np 

a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9]) 
index = [2, 3, 6] 

new_a = np.delete(a, index) 

print(new_a) #Prints `[1, 2, 5, 6, 8, 9]` 

ध्यान दें कि numpy.delete() एक नई सरणी के बाद से array scalars हैं रिटर्न अपरिवर्तनीय, पायथन में तारों के समान, इसलिए प्रत्येक बार जब कोई परिवर्तन किया जाता है, तो एक नई वस्तु बनाई जाती है। कोड मैं पोस्ट उत्पादन है

"A copy of arr with the elements specified by obj removed. Note that delete does not occur in-place..."

, यह कोड चलाने का परिणाम है: अर्थात, और delete()docs उद्धृत करने के लिए।

+1

आपको बहुत बहुत धन्यवाद। मैंने कोशिश की कि bur किसी कारण से काम नहीं कर सका। यह अब काम करता है –

+0

@DanielThaagaardAndreasen मदद करने में सक्षम होने के लिए खुश है। – Levon

+1

यह उत्तर भ्रामक है। Numpy.delete का दूसरा तर्क उस आइटम का सूचकांक नहीं है जिसे आप निकालना चाहते हैं, लेकिन वास्तविक वस्तु जिसे आप निकालना चाहते हैं। –

29

एक न्यूम्पी सरणी immutable है, जिसका अर्थ है कि आप तकनीकी रूप से इससे कोई आइटम नहीं हटा सकते हैं। हालांकि, अगर आप एक नई सरणी मूल्यों आप नहीं चाहते बिना, इस तरह का निर्माण कर सकते हैं:

b = np.delete(a, [2,3,6]) 
+0

आपके उत्तर के लिए धन्यवाद। –

+0

+1 'अपरिवर्तनीय' का उल्लेख करने के लिए +1। यह याद रखना अच्छा है, कि numpy arrays जल्दी के लिए अच्छा नहीं है आकार के परिवर्तन (तत्वों को जोड़ना/हटाना) – eumiro

+20

तकनीकी रूप से, numpy arrays mutable हैं। उदाहरण के लिए, यह: 'a [0] = 1' जगह' ए 'को संशोधित करता है। लेकिन उनका आकार बदला नहीं जा सकता है। – btel

4

नहीं एक numpy व्यक्ति होने के नाते, मैं के साथ एक शॉट ले लिया: के अनुसार

>>> import numpy as np 
>>> import itertools 
>>> 
>>> a = np.array([1,2,3,4,5,6,7,8,9]) 
>>> index=[2,3,6] 
>>> a = np.array(list(itertools.compress(a, [i not in index for i in range(len(a))]))) 
>>> a 
array([1, 2, 5, 6, 8, 9]) 

मेरे परीक्षण, यह numpy.delete() से बेहतर प्रदर्शन करता है। मुझे नहीं पता कि यह मामला क्यों होगा, शायद शुरुआती सरणी के छोटे आकार के कारण?

python -m timeit -s "import numpy as np" -s "import itertools" -s "a = np.array([1,2,3,4,5,6,7,8,9])" -s "index=[2,3,6]" "a = np.array(list(itertools.compress(a, [i not in index for i in range(len(a))])))" 
100000 loops, best of 3: 12.9 usec per loop 

python -m timeit -s "import numpy as np" -s "a = np.array([1,2,3,4,5,6,7,8,9])" -s "index=[2,3,6]" "np.delete(a, index)" 
10000 loops, best of 3: 108 usec per loop 

कि (करने के लिए मैं क्या उम्मीद कर रहा था विपरीत दिशा में) एक बहुत महत्वपूर्ण अंतर है, किसी को भी किसी भी विचार क्यों यह मामला होगा है?

और भी अजीब बात यह है कि numpy.delete() गुजरने से सूची सूची के माध्यम से लूपिंग और इसे एकल सूचकांक देने से भी बदतर होती है।

python -m timeit -s "import numpy as np" -s "a = np.array([1,2,3,4,5,6,7,8,9])" -s "index=[2,3,6]" "for i in index:" " np.delete(a, i)" 
10000 loops, best of 3: 33.8 usec per loop 

संपादित करें: यह सरणी के आकार के साथ ऐसा प्रतीत होता है। बड़े सरणी के साथ, numpy.delete() काफी तेज़ है।

python -m timeit -s "import numpy as np" -s "import itertools" -s "a = np.array(list(range(10000)))" -s "index=[i for i in range(10000) if i % 2 == 0]" "a = np.array(list(itertools.compress(a, [i not in index for i in range(len(a))])))" 
10 loops, best of 3: 200 msec per loop 

python -m timeit -s "import numpy as np" -s "a = np.array(list(range(10000)))" -s "index=[i for i in range(10000) if i % 2 == 0]" "np.delete(a, index)" 
1000 loops, best of 3: 1.68 msec per loop 

जाहिर है, यह सब बहुत अप्रासंगिक के रूप में आप हमेशा स्पष्टता के लिए जाने के लिए और पहिया पुनर्रचना से बचना चाहिए है, लेकिन मैं इसे एक छोटे से रोचक लगा, इसलिए मैंने सोचा कि मैं इसे यहाँ छोड़ चाहते हैं।

+2

आप जो भी सावधान रहें वास्तव में तुलना करें! आपके पहले पुनरावृत्ति में आपके पास 'a = delte_stuff (ए)' है, जो प्रत्येक पुनरावृत्ति के साथ 'छोटा' बनाता है। जब आप इनबिल्ड फ़ंक्शन का उपयोग करते हैं, तो आप मान को वापस उस पर संग्रहीत नहीं करते हैं, जिसमें एक मूल आकार! बीएस यदि आप 'इंडेक्स' का एक सेट ouf बनाते हैं और उसके खिलाफ जांच करते हैं, तो आइटम को हटाना है या नहीं, तो आप अपने फ़ंक्शन को तेजी से बढ़ा सकते हैं। दोनों चीजों को ठीक करने के लिए, मुझे 10k आइटम मिलते हैं: 6.22 आपके फ़ंक्शन के साथ msec प्रति लूप, 'numpy.delete' के लिए 4.48 msec, जो मोटे तौर पर आप अपेक्षा करेंगे। – Michael

+2

दो और संकेत: 'np.array (सूची (रेंज (x)) के बजाय '' np.arange (x) 'का उपयोग करें, और अनुक्रमणिका बनाने के लिए, आप' np.s _ [:: 2] ' । – Michael

25

इसके साथ मदद करने के लिए एक गंदे अंतर्निहित फ़ंक्शन है।

import numpy as np 
>>> a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9]) 
>>> b = np.array([3,4,7]) 
>>> c = np.setdiff1d(a,b) 
>>> c 
array([1, 2, 5, 6, 8, 9]) 
+2

जानना अच्छा है। मैं सोच रहा था कि np.delete धीमा हो जाएगा लेकिन हां, 1000 पूर्णांक के लिए समय सीमा कहता है कि हटा x2 तेज है। – wbg

0

आप सूचकांक पता नहीं है, तो आप उपयोग नहीं कर सकते logical_and

x = 10*np.random.randn(1,100) 
low = 5 
high = 27 
x[0,np.logical_and(x[0,:]>low,x[0,:]<high)] 
संबंधित मुद्दे