শর্ত পূরণ হলে নম্পি উপাদানগুলি প্রতিস্থাপন


94

আমার কাছে একটি বৃহত্তর ন্যারি অ্যারে রয়েছে যাতে আমাকে এমনভাবে চালিত করতে হবে যাতে শর্ত পূরণ হলে প্রতিটি উপাদান 1 বা 0 তে পরিবর্তিত হয় (পরে পিক্সেল মাস্ক হিসাবে ব্যবহৃত হবে)। অ্যারেতে প্রায় 8 মিলিয়ন উপাদান রয়েছে এবং হ্রাস পাইপলাইনে আমার বর্তমান পদ্ধতিটি খুব বেশি সময় নেয়:

for (y,x), value in numpy.ndenumerate(mask_data): 

    if mask_data[y,x]<3: #Good Pixel
        mask_data[y,x]=1
    elif mask_data[y,x]>3: #Bad Pixel
        mask_data[y,x]=0

এমন কি কোনও অদ্ভুত ক্রিয়া আছে যা এই গতি বাড়িয়ে দেবে?


4
আপনি যদি কি হতে চান mask_data[y,x]==3?
ডিএসএম

ভাল কথা, এটি এখনও খারাপ পিক্সেল হবে। আমি শর্তটি পরিবর্তন করবif mask_data[y,x]>=3:
ক্রিসফ্রো

উত্তর:


128
>>> import numpy as np
>>> a = np.random.randint(0, 5, size=(5, 4))
>>> a
array([[4, 2, 1, 1],
       [3, 0, 1, 2],
       [2, 0, 1, 1],
       [4, 0, 2, 3],
       [0, 0, 0, 2]])
>>> b = a < 3
>>> b
array([[False,  True,  True,  True],
       [False,  True,  True,  True],
       [ True,  True,  True,  True],
       [False,  True,  True, False],
       [ True,  True,  True,  True]], dtype=bool)
>>> 
>>> c = b.astype(int)
>>> c
array([[0, 1, 1, 1],
       [0, 1, 1, 1],
       [1, 1, 1, 1],
       [0, 1, 1, 0],
       [1, 1, 1, 1]])

আপনি এটি দিয়ে সংক্ষিপ্ত করতে পারেন:

>>> c = (a < 3).astype(int)

4
কীভাবে কিছু কলাম কখনও বিচ্ছিন্ন না করে নির্দিষ্ট কলামগুলিতে এটি করা যায় এবং তারপরে আবার কী বরাদ্দ দেওয়া হয়? উদাহরণস্বরূপ, শর্তাবলী পূরণের সময় কেবল [2, 3] কলামের উপাদানগুলির মান পরিবর্তন করা উচিত, যখন অন্য কলামগুলি শর্ত পূরণ না করেও পরিবর্তন করে না।
kuixiong

সত্য, তবে কেবল শূন্য এবং তাদের ক্ষেত্রে। নীচে আরও সাধারণ উত্তর দেখুন (দক্ষতার ব্যয়ে)
বার্গার

89
>>> a = np.random.randint(0, 5, size=(5, 4))
>>> a
array([[0, 3, 3, 2],
       [4, 1, 1, 2],
       [3, 4, 2, 4],
       [2, 4, 3, 0],
       [1, 2, 3, 4]])
>>> 
>>> a[a > 3] = -101
>>> a
array([[   0,    3,    3,    2],
       [-101,    1,    1,    2],
       [   3, -101,    2, -101],
       [   2, -101,    3,    0],
       [   1,    2,    3, -101]])
>>>

উদাহরণস্বরূপ, বুলিয়ান অ্যারেগুলির সাথে সূচীকরণ দেখুন ।


4
দুর্দান্ত জিনিস, ধন্যবাদ! আপনি যে মানটি পরিবর্তন করেছেন তা উল্লেখ করতে চাইলে আপনি এর মতো কিছু ব্যবহার করতে পারেন a[a > 3] = -101+a[a > 3]
পেক্সমার

4
@ পেক্সমার যদিও আপনি এর a[a > 3] = -101+a[a > 3]পরিবর্তে এটি করেন তবে a[a > 3] += -101সম্ভবত মেমরি ফাঁস হওয়ার সম্ভাবনা রয়েছে।
স্যামুয়েল প্রিভস্ট

4
পেক্সমার জিজ্ঞাসা করার সাথে সাথে আপনি যে মানটি পরিবর্তন করেছেন তা কীভাবে উল্লেখ করবেন ??
জুয়ান

34

দ্রুততম (এবং সবচেয়ে নমনীয়) পথ ব্যবহার করা np.where যা একটি মাস্ক (সত্য এবং মিথ্যা মূল্যবোধের অ্যারে) অনুযায়ী দুইটি অ্যারের মধ্যে বেছে নেয়,:

import numpy as np
a = np.random.randint(0, 5, size=(5, 4))
b = np.where(a<3,0,1)
print('a:',a)
print()
print('b:',b)

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

a: [[1 4 0 1]
 [1 3 2 4]
 [1 0 2 1]
 [3 1 0 0]
 [1 4 0 1]]

b: [[0 1 0 0]
 [0 1 0 1]
 [0 0 0 0]
 [1 0 0 0]
 [0 1 0 0]]

4
শর্ত পূরণ না হলে আমি কোনও কিছুর সাথে প্রতিস্থাপন করতে না চাইলে সবচেয়ে ভাল উপায় কী হবে? যেমন শর্ত পূরণ হলে কেবলমাত্র সরবরাহের মান দিয়ে প্রতিস্থাপন করুন, যদি আসল নম্বরটি যেমন না রেখে থাকেন তবে ....
অভিষেক সেনগুপ্ত

4
একটিতে সমস্ত মানগুলি প্রতিস্থাপন করতে, যা 3 এর চেয়ে ছোট হয় এবং a[a<3] = 0
বাকীটি

3

আপনি আপনার মুখোশের অ্যারেটি এভাবে এক ধাপে তৈরি করতে পারেন

mask_data = input_mask_data < 3

এটি একটি বুলিয়ান অ্যারে তৈরি করে যা পরে পিক্সেল মাস্ক হিসাবে ব্যবহার করা যেতে পারে। নোট করুন যে আমরা ইনপুট অ্যারে পরিবর্তন করি নি (যেমন আপনার কোড হিসাবে) তবে মুখোশের ডেটা ধরে রাখতে একটি নতুন অ্যারে তৈরি করেছি - আমি এটি এইভাবে করার পরামর্শ দিচ্ছি।

>>> input_mask_data = np.random.randint(0, 5, (3, 4))
>>> input_mask_data
array([[1, 3, 4, 0],
       [4, 1, 2, 2],
       [1, 2, 3, 0]])
>>> mask_data = input_mask_data < 3
>>> mask_data
array([[ True, False, False,  True],
       [False,  True,  True,  True],
       [ True,  True, False,  True]], dtype=bool)
>>> 

4
হ্যাঁ ওপি যদি সত্যিই 0 ও 1 গুলি চায় তবে সে ব্যবহার করতে পারে .astype(int)বা *1, তবে একটি অ্যারে Trueএবং Falseএটি ঠিক ততটাই ভাল।
ডিএসএম

-4

আমি নিশ্চিত না যে আমি আপনার প্রশ্নটি বুঝতে পেরেছি, তবে আপনি যদি লিখেন:

mask_data[:3, :3] = 1
mask_data[3:, 3:] = 0

এটি মাস্ক ডেটার সমস্ত মানকে তৈরি করবে যার x এবং y সূচকগুলি 1 এর সমান হতে 3 এর কম হবে এবং সমস্ত বাকী 0 এর সমান হবে

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