python - একটি অ্যারে মধ্যে কিছু প্রথম সূচক ফেরত একটি NumPy ফাংশন আছে?




arrays (9)

1 ডি অ্যারের জন্য, আমি np.flatnonzero(array == value)[0] সুপারিশ np.flatnonzero(array == value)[0] , যা np.nonzero(array == value)[0][0] এবং np.where(array == value)[0][0] কিন্তু একটি 1-উপাদান টুপল আনবক্সিং এর কুৎসিততা এড়ানো।

আমি জানি পাইথন লিস্টের জন্য একটি পদ্ধতি যা প্রথম সূচীটি ফেরত পাঠাতে পারে:

>>> l = list([1, 2, 3])
>>> l.index(2)
1

NumPy অ্যারে জন্য যে মত কিছু আছে?


Np.where () থেকে প্রথম উপাদানটি নির্বাচন করার বিকল্পটি জেনারেটরের অভিব্যক্তিটি একত্রিত করে একত্রিত করা, যেমন:

>>> import numpy as np
>>> x = np.arange(100)   # x = array([0, 1, 2, 3, ... 99])
>>> next(i for i, x_i in enumerate(x) if x_i == 2)
2

একটি দুই মাত্রিক অ্যারের জন্য একটি করবে:

>>> x = np.arange(100).reshape(10,10)   # x = array([[0, 1, 2,... 9], [10,..19],])
>>> next((i,j) for i, x_i in enumerate(x) 
...            for j, x_ij in enumerate(x_i) if x_ij == 2)
(0, 2)

এই পদ্ধতির সুবিধাটি প্রথম ম্যাচটি পাওয়া যাওয়ার পরে অ্যারের উপাদানগুলি পরীক্ষা করা বন্ধ করে দেয়, যেখানে np.where একটি মিলের জন্য সমস্ত উপাদান পরীক্ষা করে। অ্যারের মধ্যে মিল আছে যদি একটি জেনারেটরের এক্সপ্রেশন দ্রুত হবে।


আপনি একটি NumPy অ্যারে বায়ু তালিকা এবং তার সূচক পেতে রূপান্তর করতে পারেন। উদাহরণ স্বরূপ,

l = [1,2,3,4,5] # Python list
a = numpy.array(l) # NumPy array
i = a.tolist().index(2) # i will return index of 2
print i

এটা 1 মুদ্রণ করা হবে।


এক-মাত্রিক সাজানো অ্যারের জন্য, এটি অনেক সহজ এবং কার্যকর হবে (লগ (এন)) numpy.searchsorted ব্যবহার numpy.searchsorted যা একটি NumPy পূর্ণসংখ্যা (অবস্থান) প্রদান করে। উদাহরণ স্বরূপ,

arr = np.array([1, 1, 1, 2, 3, 3, 4])
i = np.searchsorted(arr, 3)

শুধু অ্যারে ইতিমধ্যে সাজানো নিশ্চিত করুন

অনুসন্ধানকৃত উপাদানটি আসলে অনুসন্ধানকৃত উপাদানটি রয়েছে কিনা তাও পরীক্ষা করে দেখুন, কারণ সার্চসোর্টেডের মূল উদ্দেশ্য সূচকগুলি খুঁজে বের করা যেখানে আদেশ বজায় রাখার জন্য উপাদানগুলি সন্নিবেশ করা উচিত।

if arr[i] == 3:
    print("present")
else:
    print("not present")

প্রথম সূচীটি খুঁজে পেতে np.ndenumerate ভিত্তিক একটি খুব কার্যকরী এবং সহজ numba বিকল্প np.ndenumerate করার জন্য:

from numba import njit
import numpy as np

@njit
def index(array, item):
    for idx, val in np.ndenumerate(array):
        if val == item:
            return idx
    # If no item was found return None, other return types might be a problem due to
    # numbas type inference.

এটি বেশ দ্রুত এবং মাল্টিডাইমেনশনাল অ্যারের সাথে স্বাভাবিকভাবেই ডিল করে :

>>> arr1 = np.ones((100, 100, 100))
>>> arr1[2, 2, 2] = 2

>>> index(arr1, 2)
(2, 2, 2)

>>> arr2 = np.ones(20)
>>> arr2[5] = 2

>>> index(arr2, 2)
(5,)

np.where বা np.nonzero ব্যবহার করে যে কোনও পদ্ধতির চেয়ে এটি আরও দ্রুত হতে পারে (এটি অপারেশনটিকে ছোট করে np.where )।

তবে np.argwhere এছাড়াও মাল্টিডাইমেনশনাল অ্যারেগুলির সাথে চিত্তাকর্ষকভাবে মোকাবিলা করতে পারে (আপনাকে ম্যানুয়ালি এটি একটি np.argwhere নিক্ষেপ করতে হবে এবং এটি স্বল্প-সার্কিট নয়) তবে কোনও মিল পাওয়া গেলে এটি ব্যর্থ হবে:

>>> tuple(np.argwhere(arr1 == 2)[0])
(2, 2, 2)
>>> tuple(np.argwhere(arr2 == 2)[0])
(5,)

যদি আপনার কেবলমাত্র একটি মানের প্রথম ঘটনার সূচী দরকার হয় তবে আপনি nonzero (বা where , এই ক্ষেত্রে একই জিনিসটির পরিমাণ) ব্যবহার করতে পারেন:

>>> t = array([1, 1, 1, 2, 2, 3, 8, 3, 8, 8])
>>> nonzero(t == 8)
(array([6, 8, 9]),)
>>> nonzero(t == 8)[0][0]
6

আপনি যদি প্রতিটি মানের প্রতিটি সূচকের প্রথম সূচীটি প্রয়োজন তবে আপনি স্পষ্টভাবে বারবার একইভাবে কাজ করতে পারেন তবে একটি কৌশল যা দ্রুত হতে পারে। নিম্নলিখিত প্রতিটি পরবর্তী প্রথম উপাদান সূচক নির্দেশ করে:

>>> nonzero(r_[1, diff(t)[:-1]])
(array([0, 3, 5, 6, 7, 8]),)

লক্ষ্য করুন যে এটি 3s এর পরবর্তী এবং উভয়ের 8 সেকেন্ডের উভয় প্রারম্ভের সন্ধান পায়:

[ 1 , 1, 1, 2 , 2, 3 , 8 , 3 , 8 , 8]

সুতরাং এটি প্রতিটি মান প্রথম সংঘটিত খুঁজে পাওয়ার চেয়ে সামান্য ভিন্ন। আপনার প্রোগ্রামে, আপনি যা চান তা পেতে আপনি t সাজানো সংস্করণটির সাথে কাজ করতে সক্ষম হতে পারেন:

>>> st = sorted(t)
>>> nonzero(r_[1, diff(st)[:-1]])
(array([0, 3, 5, 7]),)

হ্যাঁ, এখানে একটি NumPy অ্যারে, array , এবং একটি মান, item , এর জন্য উত্তর দেওয়া হল:

itemindex = numpy.where(array==item)

ফলাফলটি প্রথম সারির সূচকগুলির সাথে একটি টুপল, তারপর সমস্ত কলাম সূচক।

উদাহরণস্বরূপ, যদি একটি অ্যারে দুটি মাত্রা হয় এবং এতে আপনার আইটেমটি দুটি অবস্থানে থাকে তবে

array[itemindex[0][0]][itemindex[1][0]]

আপনার আইটেম সমান হবে এবং তাই হবে

array[itemindex[0][1]][itemindex[1][1]]

numpy.where


numpy_indexed প্যাকেজ (দাবিত্যাগ, আমি তার লেখক) একটি numpt.ndarray জন্য list.index একটি ভেক্টরাইজড সমতুল্য রয়েছে; এটাই:

sequence_of_arrays = [[0, 1], [1, 2], [-5, 0]]
arrays_to_query = [[-5, 0], [1, 0]]

import numpy_indexed as npi
idx = npi.indices(sequence_of_arrays, arrays_to_query, missing=-1)
print(idx)   # [2, -1]

এই সমাধানটি ভেক্টরাইজড হয়েছে, অ্যানড্রেসে সাধারণীকরণ করে, এবং অনুপস্থিত মানের সাথে আচরণ করার বিভিন্ন উপায় রয়েছে।


দ্রষ্টব্য: এই পাইথন 2.7 সংস্করণ জন্য

আপনি সমস্যার সাথে মোকাবিলা করতে একটি Lambda ফাংশন ব্যবহার করতে পারেন, এবং এটি NumPy অ্যারে এবং তালিকা উভয় কাজ করে।

your_list = [11, 22, 23, 44, 55]
result = filter(lambda x:your_list[x]>30, range(len(your_list)))
#result: [3, 4]

import numpy as np
your_numpy_array = np.array([11, 22, 23, 44, 55])
result = filter(lambda x:your_numpy_array [x]>30, range(len(your_list)))
#result: [3, 4]

এবং আপনি ব্যবহার করতে পারেন

result[0]

ফিল্টার উপাদান প্রথম সূচক পেতে।

পাইথন 3.6 এর জন্য ব্যবহার করুন

list(result)

পরিবর্তে

result






numpy