আমি কীভাবে কোনও নম্র অ্যারে থেকে কিছু নির্দিষ্ট উপাদান সরিয়ে ফেলতে পারি? বলুন আমার আছে
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 দ্বারা নির্দিষ্ট উপাদানের সঙ্গে-Arr এর সরানো হয়েছে। লক্ষ্য করুন ডিলিট ইন-জায়গা ঘটবে না ..."
আমার পোস্ট করা কোডটিতে যদি আউটপুট থাকে তবে এটি কোড চালানোর ফলাফল।
এটিতে সহায়তা করার জন্য একটি বিলম্বিত অন্তর্নির্মিত ফাংশন রয়েছে।
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']))
একটি নম্পি অ্যারে অপরিবর্তনীয় , এর অর্থ আপনি প্রযুক্তিগতভাবে এটি থেকে কোনও আইটেম মুছতে পারবেন না। তবে আপনি যে মানগুলি চান না তা ছাড়াই আপনি একটি নতুন অ্যারে তৈরি করতে পারেন:
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
এবং কোনও আইটেম মুছতে চান না তখন আপনি তার ক্রমটি তীব্রতর করতে পারেন। উভয় জিনিস ঠিক করা, আমি 10 কে আইটেমের জন্য পেয়েছি: আপনার ফাংশন সহ লুপ প্রতি 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]])