নম্পি: সীমার মধ্যে উপাদানগুলির সূচকটি সন্ধান করুন


88

আমার কাছে সংখ্যাগুলির একটি অলপ অ্যারে রয়েছে, উদাহরণস্বরূপ,

a = np.array([1, 3, 5, 6, 9, 10, 14, 15, 56])  

আমি একটি নির্দিষ্ট ব্যাপ্তির মধ্যে উপাদানগুলির সমস্ত সূচকগুলি খুঁজতে চাই। উদাহরণস্বরূপ, যদি পরিসীমাটি (6, 10) হয় তবে উত্তরটি (3, 4, 5) হওয়া উচিত। এটি করার জন্য কোনও বিল্ট-ইন ফাংশন রয়েছে কি?

উত্তর:


148

আপনি np.whereসূচকগুলি পেতে এবং np.logical_andদুটি শর্ত নির্ধারণ করতে ব্যবহার করতে পারেন :

import numpy as np
a = np.array([1, 3, 5, 6, 9, 10, 14, 15, 56])

np.where(np.logical_and(a>=6, a<=10))
# returns (array([3, 4, 5]),)

6
বিটিডব্লিউ, একই দ্বারা অর্জন করা হয় np.nonzero(np.logical_and(a>=6, a<=10))
ইলেক্ট্রোলজ

14
এছাড়াও np.where((a > 6) & (a <= 10))
ইলিন্ডা

বহুমাত্রিক অ্যারেগুলি দিয়ে ভাল করতে পারে বলে মনে হচ্ছে না
মনিকা হেডডনেক

4
@ এলিন্দা যদিও np.logical_andতত দ্রুত &। এবং np.whereচেয়ে দ্রুত np.nonzero
স্কিলমন টপংসওয়ার্স.অ্যাক্সিজ পছন্দ করেছেন

68

@ ডিএননিচুসৌরের জবাব হিসাবে, তবে আরও কমপ্যাক্ট:

In [7]: np.where((a >= 6) & (a <=10))
Out[7]: (array([3, 4, 5]),)

20
ভাল লাগল আপনি a[(a >= 6) & (a <= 10)]যদি aঅসাড় অ্যারে হয় তা করতেও পারেন ।
ws_e_c421

4
আমি যদি মন্তব্যটির শব্দটির সাথে কারও মত বিভ্রান্ত হয়ে পড়ে যাই: এটি সাধারণ তালিকার পক্ষে কাজ করে না, কেবল তখনই aএটি একটি অদ্ভুত অ্যারে হয়
প্রফেসর

15

আমি ভেবেছিলাম আমি এটি যুক্ত করব কারণ aআপনি যে উদাহরণটি দিয়েছেন তা সাজানো হয়েছে:

import numpy as np
a = [1, 3, 5, 6, 9, 10, 14, 15, 56] 
start = np.searchsorted(a, 6, 'left')
end = np.searchsorted(a, 10, 'right')
rng = np.arange(start, end)
rng
# array([3, 4, 5])


6

উত্তরের সংক্ষিপ্তসার

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

a = np.array([1, 3, 5, 6, 9, 10, 14, 15, 56])

উত্তরটি নির্দিষ্ট ব্যাপ্তির মধ্যে থাকা উপাদানের সূচকগুলি হওয়া উচিত , আমরা অন্তর্ভুক্ত হিসাবে ধরে নিই, এই ক্ষেত্রে, 6 এবং 10।

answer = (3, 4, 5)

মান অনুসারে 6,9,10।

সেরা উত্তরের পরীক্ষার জন্য আমরা এই কোডটি ব্যবহার করতে পারি।

import timeit
setup = """
import numpy as np
import numexpr as ne

a = np.array([1, 3, 5, 6, 9, 10, 14, 15, 56])
# we define the left and right limit
ll = 6
rl = 10

def sorted_slice(a,l,r):
    start = np.searchsorted(a, l, 'left')
    end = np.searchsorted(a, r, 'right')
    return np.arange(start,end)
"""

functions = ['sorted_slice(a,ll,rl)', # works only for sorted values
'np.where(np.logical_and(a>=ll, a<=rl))[0]',
'np.where((a >= ll) & (a <=rl))[0]',
'np.where((a>=ll)*(a<=rl))[0]',
'np.where(np.vectorize(lambda x: ll <= x <= rl)(a))[0]',
'np.argwhere((a>=ll) & (a<=rl)).T[0]', # we traspose for getting a single row
'np.where(ne.evaluate("(ll <= a) & (a <= rl)"))[0]',]

functions2 = [
   'a[np.logical_and(a>=ll, a<=rl)]',
   'a[(a>=ll) & (a<=rl)]',
   'a[(a>=ll)*(a<=rl)]',
   'a[np.vectorize(lambda x: ll <= x <= rl)(a)]',
   'a[ne.evaluate("(ll <= a) & (a <= rl)")]',
]

ফলাফল

ফলাফল নিম্নলিখিত প্লট রিপোর্ট করা হয়। শীর্ষে দ্রুততম সমাধানগুলি। এখানে চিত্র বর্ণনা লিখুন যদি সূচকগুলির পরিবর্তে মানগুলি বের করতে চান তবে আপনি ফাংশন 2 ব্যবহার করে পরীক্ষা করতে পারবেন তবে ফলাফলগুলি প্রায় একই রকম।


4
এই ফলাফলগুলি কেবল নির্দিষ্ট দৈর্ঘ্যের অ্যারের জন্য প্রযোজ্য (এখানে আপনি খুব ছোট অ্যারে বেছে নিয়েছেন)। এই ফলাফলগুলি বৃহত্তর অ্যারেগুলির জন্য দ্রুত পরিবর্তিত হয়
ইজলিয়ারার

4

এই কোড স্নিপেট দুটি মানের মধ্যে একটি নমপি অ্যারে সমস্ত নম্বর প্রদান করে:

a = np.array([1, 3, 5, 6, 9, 10, 14, 15, 56] )
a[(a>6)*(a<10)]

এটি নিম্নলিখিত হিসাবে কাজ করে: (a> 6) সত্য (1) এবং মিথ্যা (0) এর সাথে একটি অদ্ভুত অ্যারে প্রদান করে, (a <10) করে। এই দুটি একসাথে গুন করে আপনি উভয় বিবৃতি যদি সত্য হয় (তবে 1x1 = 1) বা মিথ্যা (কারণ 0x0 = 0 এবং 1x0 = 0) হয় তবে একটি সত্য দিয়ে একটি অ্যারে পাবেন।

অংশটি [...] অ্যারের সমস্ত মান প্রদান করে যেখানে বন্ধনীগুলির মধ্যে অ্যারেটি সত্য বিবৃতি দেয়।

অবশ্যই আপনি উদাহরণস্বরূপ বলে আরও জটিল করতে পারেন

...*(1-a<10) 

যা একটি "এবং না" স্টেটমেন্টের অনুরূপ।



2

অন্য উপায় সহ:

np.vectorize(lambda x: 6 <= x <= 10)(a)

যা প্রত্যাবর্তন করে:

array([False, False, False,  True,  True,  True, False, False, False])

এটি কখনও কখনও সময় সিরিজ, ভেক্টর ইত্যাদির মুখোশগুলির জন্য দরকারী


1

মিশ্রণে numexpr যোগ করতে চেয়েছিলেন :

import numpy as np
import numexpr as ne

a = np.array([1, 3, 5, 6, 9, 10, 14, 15, 56])  

np.where(ne.evaluate("(6 <= a) & (a <= 10)"))[0]
# array([3, 4, 5], dtype=int64)

লক্ষ লক্ষ দিয়ে কেবল বৃহত্তর অ্যারেগুলির জন্য অর্থবোধ করতে হবে ... বা আপনি যদি কোনও স্মৃতি সীমাবদ্ধ করে থাকেন।


0
s=[52, 33, 70, 39, 57, 59, 7, 2, 46, 69, 11, 74, 58, 60, 63, 43, 75, 92, 65, 19, 1, 79, 22, 38, 26, 3, 66, 88, 9, 15, 28, 44, 67, 87, 21, 49, 85, 32, 89, 77, 47, 93, 35, 12, 73, 76, 50, 45, 5, 29, 97, 94, 95, 56, 48, 71, 54, 55, 51, 23, 84, 80, 62, 30, 13, 34]

dic={}

for i in range(0,len(s),10):
    dic[i,i+10]=list(filter(lambda x:((x>=i)&(x<i+10)),s))
print(dic)

for keys,values in dic.items():
    print(keys)
    print(values)

আউটপুট:

(0, 10)
[7, 2, 1, 3, 9, 5]
(20, 30)
[22, 26, 28, 21, 29, 23]
(30, 40)
[33, 39, 38, 32, 35, 30, 34]
(10, 20)
[11, 19, 15, 12, 13]
(40, 50)
[46, 43, 44, 49, 47, 45, 48]
(60, 70)
[69, 60, 63, 65, 66, 67, 62]
(50, 60)
[52, 57, 59, 58, 50, 56, 54, 55, 51]  

0

এটি সবচেয়ে সুন্দর নাও হতে পারে তবে যে কোনও মাত্রার জন্য কাজ করে

a = np.array([[-1,2], [1,5], [6,7], [5,2], [3,4], [0, 0], [-1,-1]])
ranges = (0,4), (0,4) 

def conditionRange(X : np.ndarray, ranges : list) -> np.ndarray:
    idx = set()
    for column, r in enumerate(ranges):
        tmp = np.where(np.logical_and(X[:, column] >= r[0], X[:, column] <= r[1]))[0]
        if idx:
            idx = idx & set(tmp)
        else:
            idx = set(tmp)
    idx = np.array(list(idx))
    return X[idx, :]

b = conditionRange(a, ranges)
print(b)

-4

আপনি np.clip()এটি অর্জন করতে ব্যবহার করতে পারেন :

a = [1, 3, 5, 6, 9, 10, 14, 15, 56]  
np.clip(a,6,10)

তবে এটি যথাক্রমে and এবং ১০ এর চেয়ে কম এবং তার চেয়ে বেশি মান ধারণ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.