কীভাবে একটি নমপি অ্যারেতে নির্দিষ্ট উপাদানগুলি সরিয়ে ফেলা যায়


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 দ্বারা নির্দিষ্ট উপাদানের সঙ্গে-Arr এর সরানো হয়েছে। লক্ষ্য করুন ডিলিট ইন-জায়গা ঘটবে না ..."

আমার পোস্ট করা কোডটিতে যদি আউটপুট থাকে তবে এটি কোড চালানোর ফলাফল।


1
@ ইঙ্গভিগটসন আপনি যখন নিজের সম্পাদনা করেছেন, আপনি কোডটি চালিত করে এখন 2, 3, 6 থেকে 3, 4, 7 পর্যন্ত উপাদানগুলির জন্য সঠিক মানগুলিও পরিবর্তন করেছেন origin "আমি সম্পাদনাটি ফিরিয়ে
আনছি

1
অ্যাট্রিবিউটআরার: 'তালিকা' অবজেক্টটির কোনও বৈশিষ্ট্য নেই 'মুছুন'
মুনমুনব্ব

3
@ ইঙ্গভিগটসন না, আপনার মন্তব্য বিভ্রান্তিকর। এটি প্রত্যাশার মতো কাজ করে। তবে numpy.delete () এর ডকুমেন্টেশন নোট করে যে "প্রায়শই এটি বুলিয়ান মাস্ক ব্যবহার করা ভাল"; এর একটি উদাহরণও দেওয়া আছে।
Biggsy

1
@ লাইভন আপনি 2 ডি এর উদাহরণ যোগ করতে পারেন?
ম্যাটস

7
@ ইঙ্গভিগটসন আপনি ভুল করেছেন এটি মুছে ফেলার জন্য আইটেমের সূচকগুলি নেয়, আইটেমগুলি নিজেরাই নয়।
লে ফ্রাইট

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
জানা ভাল. আমি ভাবছিলাম যে এনপি.ডিলেটটি ধীর হবে তবে হায়, 1000 এর পূর্ণসংখ্যার সময়কাল বলে যে মুছাটি এক্স 2 দ্রুত হয়।
wbg

1
এটি দুর্দান্ত কারণ এটি আপনাকে মুছে ফেলার সূচক / সূচকগুলি সরবরাহ না করে অ্যারের মানগুলিতে পরিচালিত করে । উদাহরণস্বরূপ:np.setdiff1d(np.array(['one','two']),np.array(['two', 'three']))
MD004

এটি আউটপুটও বাছাই করে, যা যা চেয়েছিল তা নাও হতে পারে। নাহলে খুব সুন্দর।
রায়জিঞ্জ

প্রশ্নটি বলছে "আমি সমস্ত জানি মানগুলির সূচক"। সুতরাং, এটি তাদের সূচকগুলি অনুসারে আইটেমগুলি সরিয়ে দেওয়ার, তাদের মানগুলি দিয়ে সরিয়ে না
দেওয়ার বিষয়ে

35

একটি নম্পি অ্যারে অপরিবর্তনীয় , এর অর্থ আপনি প্রযুক্তিগতভাবে এটি থেকে কোনও আইটেম মুছতে পারবেন না। তবে আপনি যে মানগুলি চান না তা ছাড়াই আপনি একটি নতুন অ্যারে তৈরি করতে পারেন:

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

1
'অপরিবর্তনীয়' উল্লেখ করার জন্য +1। এটি মনে রাখা ভাল, যে অদ্ভুত অ্যারেগুলি আকারের দ্রুত পরিবর্তনের জন্য (উপাদানগুলিকে সংযোজন / মুছে ফেলার জন্য) ভাল নয়
ইউরোও

38
প্রযুক্তিগতভাবে, নামী অ্যারেগুলি পরিবর্তনযোগ্য। উদাহরণস্বরূপ, এটি: জায়গায় a[0]=1পরিবর্তিত aহয়। তবে তাদের পুনরায় আকার দেওয়া যাবে না।
বেটেল

3
সংজ্ঞাটি তার অপরিবর্তনীয় বলে, কিন্তু নতুন মান নির্ধারণের মাধ্যমে এটি আপনাকে সংশোধন করতে দেয়, তবে কীভাবে তা অপরিবর্তনীয়?
জেএসআর

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এবং কোনও আইটেম মুছতে চান না তখন আপনি তার ক্রমটি তীব্রতর করতে পারেন। উভয় জিনিস ঠিক করা, আমি 10 কে আইটেমের জন্য পেয়েছি: আপনার ফাংশন সহ লুপ প্রতি 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]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.