कैसे एक विशिष्ट सरणी में विशिष्ट तत्वों को निकालने के लिए


212

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

import numpy as np

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

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

जवाबों:


285

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() बाद से एक नया सरणी लौटाया जा सकता है , पाइथन में तार के समान, इसलिए हर बार जब इसमें बदलाव किया जाता है, तो एक नई वस्तु बनाई जाती है। यानी, डॉक्स को उद्धृत करने के लिए :delete()

" Obj द्वारा निर्दिष्ट तत्वों के साथ गिरफ्तारी की एक प्रति हटा दी गई है। ध्यान दें कि हटाएं जगह में नहीं होती हैं ..."

यदि मेरे द्वारा पोस्ट किए गए कोड का आउटपुट है, तो यह कोड को चलाने का परिणाम है।


1
@IngviGautsson जब आपने अपना संपादन किया, तो आपने तत्वों के लिए 2, 3, 6 से 3, 4, 7 से सही मान भी बदल दिए, यदि आप कोड चलाते हैं तो आपको सही आउटपुट नहीं मिलता है क्योंकि मूल रूप से यह मामला था। "एम एडिटिंग बैक
लेवन

1
विशेषता: 'सूची' ऑब्जेक्ट में कोई विशेषता 'डिलीट' नहीं है
munmunbb

3
@IngviGautsson नहीं, आपकी टिप्पणी भ्रामक है। यह उम्मीद के मुताबिक काम करता है। हालाँकि, numpy.delete () का प्रलेखन ध्यान देता है कि "अक्सर बूलियन मास्क का उपयोग करना बेहतर होता है"; इसका एक उदाहरण भी दिया गया है।
Biggsy

1
@ क्या आप 2 डी के लिए उदाहरण जोड़ सकते हैं?
मैट

7
@IngviGautsson आप गलत हैं। यह वस्तुओं को हटाने के सूचकांकों को लेता है, न कि वस्तुओं को स्वयं हटाने के लिए।
ले फ्राइट

64

उस के साथ मदद करने के लिए एक सुव्यवस्थित अंतर्निहित फ़ंक्शन है।

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])

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

1
यह बहुत अच्छा है क्योंकि यह उस इंडेक्स / इंडेक्स को प्रदान करने के बजाय सरणी के मूल्यों पर काम करता है जिसे आप हटाना चाहते हैं। उदाहरण के लिए:np.setdiff1d(np.array(['one','two']),np.array(['two', 'three']))
एमडी ००४

यह आउटपुट को भी सॉर्ट करता है, जो कि वांछित नहीं है। नहीं तो बहुत अच्छा।
०५ में रेज़िनज

प्रश्न कहता है "सभी मुझे पता है कि मूल्यों का सूचकांक है"। तो, यह उनके सूचकांक द्वारा वस्तुओं को हटाने के बारे में है , उनके मूल्यों के साथ नहीं हटा
शेरज़ोड

35

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

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

1
'अपरिवर्तनीय' का उल्लेख करने के लिए +1। यह याद रखना अच्छा है, कि आकार के त्वरित बदलाव (तत्वों को जोड़ना / हटाना) के लिए सुन्न सरणियाँ अच्छी नहीं हैं
यूमिरो

38
तकनीकी रूप से, सुन्न सरणियाँ परस्पर हैं। उदाहरण के लिए, यह: जगह में a[0]=1संशोधन करता aहै। लेकिन उनका आकार बदला नहीं जा सकता।
btel

3
परिभाषा यह कहती है कि यह अपरिवर्तनीय है, लेकिन यदि यह नया मान देकर इसे संशोधित करता है, तो यह अपरिवर्तनीय कैसे है?
JSR

16

मूल्य से हटाने के लिए:

modified_array = np.delete(original_array, np.where(original_array == value_to_delete))

प्रश्न अनुक्रमित द्वारा वस्तुओं को हटाने के बारे में है , विशिष्ट मूल्य वाली वस्तुओं को नहीं हटाना
शेरज़ोड

5

एक व्यक्ति के रूप में नहीं, मैंने एक शॉट लिया:

>>> 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(a)पहला पुनरावृत्ति है, जो aप्रत्येक पुनरावृत्ति के साथ छोटा बनाता है । जब आप एक इनव्यू फ़ंक्शन का उपयोग करते हैं, तो आप मान को वापस स्टोर नहीं करते हैं, जो मूल आकार में रहता है! इसके अलावा, आप अपने फंक्शन को तेजी से बढ़ा सकते हैं, जब आप एक सेट सेट करते हैं indexऔर उसके खिलाफ जांच करते हैं, कि किसी आइटम को हटाना है या नहीं। दोनों चीजों को ठीक करते हुए, मैं 10k आइटम के लिए मिलता हूं: 6.22 मिसेक प्रति लूप आपके फ़ंक्शन के साथ, 4.48 मिसे के लिए numpy.delete, जो मोटे तौर पर आप क्या उम्मीद करेंगे।
माइकल

2
दो और संकेत: np.array(list(range(x)))उपयोग के बजाय np.arange(x), और सूचकांक बनाने के लिए, आप उपयोग कर सकते हैं np.s_[::2]
माइकल

1

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

x = 10*np.random.randn(1,100)
low = 5
high = 27
x[0,np.logical_and(x[0,:]>low,x[0,:]<high)]

1

इसका उपयोग करना np.deleteसबसे तेज़ तरीका है, अगर हम उन तत्वों के सूचकांक को जानते हैं जिन्हें हम निकालना चाहते हैं। हालाँकि, पूर्णता के लिए, मुझे एक और तरीका जोड़ना है जिसमें "हटाने" एलीमेंट तत्वों का उपयोग करके बूलियन मास्क का उपयोग किया जा सकता है np.isin। यह विधि हमें सीधे या उनके सूचकांकों को निर्दिष्ट करके तत्वों को निकालने की अनुमति देती है:

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

सूचकांकों द्वारा निकालें :

indices_to_remove = [2, 3, 6]
a = a[~np.isin(np.arange(a.size), indices_to_remove)]

तत्वों द्वारा निकालें (मूल को फिर से बनाना न भूलें aक्योंकि इसे पिछली पंक्ति में फिर से लिखा गया था):

elements_to_remove = a[indices_to_remove]  # [3, 4, 7]
a = a[~np.isin(a, elements_to_remove)]

0

विशिष्ट सूचकांक निकालें (मैं मैट्रिक्स से 16 और 21 हटा दिया गया)

import numpy as np
mat = np.arange(12,26)
a = [4,9]
del_map = np.delete(mat, a)
del_map.reshape(3,4)

आउटपुट:

array([[12, 13, 14, 15],
      [17, 18, 19, 20],
      [22, 23, 24, 25]])

0

आप सेट का उपयोग भी कर सकते हैं:

a = numpy.array([10, 20, 30, 40, 50, 60, 70, 80, 90])
the_index_list = [2, 3, 6]

the_big_set = set(numpy.arange(len(a)))
the_small_set = set(the_index_list)
the_delta_row_list = list(the_big_set - the_small_set)

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