मैं एक विशिष्ट सरणी से कुछ विशिष्ट तत्वों को कैसे निकाल सकता हूं? बोलो मेरे पास है
import numpy as np
a = np.array([1,2,3,4,5,6,7,8,9])
मैं तो निकालना चाहते 3,4,7
से a
। मुझे पता है कि सभी मूल्यों का सूचकांक है ( index=[2,3,6]
)।
मैं एक विशिष्ट सरणी से कुछ विशिष्ट तत्वों को कैसे निकाल सकता हूं? बोलो मेरे पास है
import numpy as np
a = np.array([1,2,3,4,5,6,7,8,9])
मैं तो निकालना चाहते 3,4,7
से a
। मुझे पता है कि सभी मूल्यों का सूचकांक है ( index=[2,3,6]
)।
जवाबों:
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 द्वारा निर्दिष्ट तत्वों के साथ गिरफ्तारी की एक प्रति हटा दी गई है। ध्यान दें कि हटाएं जगह में नहीं होती हैं ..."
यदि मेरे द्वारा पोस्ट किए गए कोड का आउटपुट है, तो यह कोड को चलाने का परिणाम है।
उस के साथ मदद करने के लिए एक सुव्यवस्थित अंतर्निहित फ़ंक्शन है।
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])
np.setdiff1d(np.array(['one','two']),np.array(['two', 'three']))
एक Numpy सरणी अपरिवर्तनीय है , जिसका अर्थ है कि आप तकनीकी रूप से एक आइटम को हटा नहीं सकते हैं। हालाँकि, आप इस तरह के मूल्यों के बिना एक नई सरणी का निर्माण कर सकते हैं, जैसे:
b = np.delete(a, [2,3,6])
a[0]=1
संशोधन करता a
है। लेकिन उनका आकार बदला नहीं जा सकता।
मूल्य से हटाने के लिए:
modified_array = np.delete(original_array, np.where(original_array == value_to_delete))
एक व्यक्ति के रूप में नहीं, मैंने एक शॉट लिया:
>>> 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
जाहिर है, यह सब बहुत अप्रासंगिक है, क्योंकि आपको हमेशा स्पष्टता के लिए जाना चाहिए और पहिया को फिर से लगाने से बचना चाहिए, लेकिन मुझे यह थोड़ा दिलचस्प लगा, इसलिए मैंने सोचा कि मैं इसे यहां छोड़ दूंगा।
a = delte_stuff(a)
पहला पुनरावृत्ति है, जो a
प्रत्येक पुनरावृत्ति के साथ छोटा बनाता है । जब आप एक इनव्यू फ़ंक्शन का उपयोग करते हैं, तो आप मान को वापस स्टोर नहीं करते हैं, जो मूल आकार में रहता है! इसके अलावा, आप अपने फंक्शन को तेजी से बढ़ा सकते हैं, जब आप एक सेट सेट करते हैं index
और उसके खिलाफ जांच करते हैं, कि किसी आइटम को हटाना है या नहीं। दोनों चीजों को ठीक करते हुए, मैं 10k आइटम के लिए मिलता हूं: 6.22 मिसेक प्रति लूप आपके फ़ंक्शन के साथ, 4.48 मिसे के लिए numpy.delete
, जो मोटे तौर पर आप क्या उम्मीद करेंगे।
np.array(list(range(x)))
उपयोग के बजाय np.arange(x)
, और सूचकांक बनाने के लिए, आप उपयोग कर सकते हैं np.s_[::2]
।
इसका उपयोग करना 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)]
विशिष्ट सूचकांक निकालें (मैं मैट्रिक्स से 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]])