একটি নমপি অ্যারেতে নেতিবাচক মানগুলি প্রতিস্থাপন করুন


90

0 দিয়ে অ্যারেতে সমস্ত নেতিবাচক মানগুলি প্রতিস্থাপনের সহজ উপায় কি আছে?

নুমপি অ্যারে ব্যবহার করে এটি কীভাবে করা যায় তার সম্পর্কে আমার একটি সম্পূর্ণ ব্লক রয়েছে।

যেমন

a = array([1, 2, 3, -4, 5])

আমার ফিরতে হবে

[1, 2, 3, 0, 5]

a < 0 দেয়:

[False, False, False, True, False]

এখানেই আমি আটকেছি - আসল অ্যারেটি সংশোধন করতে এই অ্যারেটি কীভাবে ব্যবহার করবেন।

উত্তর:


137

আপনি সেখানে অর্ধেক আছে। চেষ্টা করুন:

In [4]: a[a < 0] = 0

In [5]: a
Out[5]: array([1, 2, 3, 0, 5])

89

চেষ্টা করুন numpy.clip:

>>> import numpy
>>> a = numpy.arange(-10, 10)
>>> a
array([-10,  -9,  -8,  -7,  -6,  -5,  -4,  -3,  -2,  -1,   0,   1,   2,
         3,   4,   5,   6,   7,   8,   9])
>>> a.clip(0, 10)
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

আপনি কেবল নীচের অর্ধেক দিয়ে ক্লিপ করতে পারেন clip(0)

>>> a = numpy.array([1, 2, 3, -4, 5])
>>> a.clip(0)
array([1, 2, 3, 0, 5])

আপনি কেবল উপরের অর্ধেকে ক্লিপ করতে পারেন clip(max=n)। (এটি আমার পূর্ববর্তী পরামর্শের চেয়ে অনেক ভাল, যা NaNপ্রথম প্যারামিটারে যেতে এবং outএই ধরণের চাপ দেওয়ার জন্য জড়িত )):

>>> a.clip(max=2)
array([ 1,  2,  2, -4,  2])

আর একটি আকর্ষণীয় পদ্ধতির ব্যবহার হ'ল where:

>>> numpy.where(a <= 2, a, 2)
array([ 1,  2,  2, -4,  2])

শেষ পর্যন্ত আইসের উত্তর বিবেচনা করুন । আমি clipসাধারণ অপারেশনগুলিকে পছন্দ করি কারণ এটি স্ব-ডকুমেন্টিং, তবে আরও জটিল ক্রিয়াকলাপগুলির জন্য তাঁর উত্তরটি পছন্দনীয়।


4
a.clip (0) যথেষ্ট হবে কারণ ওপি কেবল নেতিবাচক মানগুলি প্রতিস্থাপন করতে চায়। a.clip (0, 10) 10 এর উপরে যে কোনও কিছু বাদ দিবে
ইউসাগি

4
@ হাইট - আমি কেবল এটি চেষ্টা করেছি এবং ক্লিপটি এটি গ্রহণ করবে। প্রথমটি ন্যূনতম ধরে নেওয়া হয়।
উসাগি

অবশ্যই নম্পির সাথে সংস্করণ ইস্যু হওয়া উচিত - heres my Optut: (Pdb) np.clip (w, 0) *** TypeError: clip () কমপক্ষে 3 টি আর্গুমেন্ট নেয় (2 প্রদত্ত) - যেখানে: (পিডিবি) এনপি.সি.লিপ ( ডাব্লু, 0,1e6) অ্যারে ([[0., 0.605]])
বিপিএফ

4
@ হাইট, এর কোন সংস্করণ numpy? আপনি ক্লিপ চেষ্টা করেছেন পদ্ধতি এর a? অন্তর্নির্মিত ফাংশনটি numpy.clipআমাকে একই ত্রুটি দেয় তবে পদ্ধতিটি তা করে না।
প্রেরক

হ্যাঁ আপনি যদি এটিকে কল করে দেখেন যে এটি কাজ করে বলে মনে হয়, যেমন পি ডব্লু .ক্লিপ (0) অ্যারে ([[০.০.০ 0.০]]) - কীভাবে ক্যারিয়ার?
বিএফএফ

10

অল্প ব্যবহার না করেই আর একটি মিনিমালিস্ট পাইথনের সমাধান:

[0 if i < 0 else i for i in a]

কোনও অতিরিক্ত ফাংশন সংজ্ঞায়িত করার দরকার নেই।

a = [1, 2, 3, -4, -5.23, 6]
[0 if i < 0 else i for i in a]

উৎপাদনের:

[1, 2, 3, 0, 0, 6]

4
এটি দুর্দান্ত - আমি ভাবছিলাম সিন্ট্যাক্সটি যদি লিখিত বিবরণীটিকে তালিকা বোধের ভিতরে রাখে - আমি লুপের পরে এটি আটকে রেখে ভুল হয়ে যাচ্ছিলাম এবং কেবল তখন দুটি মান ফিরে পেয়েছি, উদাহরণস্বরূপ [0, 0] আপনার উদাহরণের জন্য তালিকা
বিএফএফ

আমি প্রাথমিকভাবে তালিকার বোধগম্য সম্পর্কে জানতে পেরে এবং একইভাবে আমার বোধগম্যতা পরীক্ষা করার জন্য বিভিন্ন জিনিস চেষ্টা করে যাচ্ছিলাম - এটি আমার জন্য লুপের পরেও রাখা আরও স্বজ্ঞাত বলে মনে হয়েছিল। এখন, যদিও এটি হয় :) forতালিকার প্রতিটি উপাদানগুলিতে এটি প্রয়োগ করার আগে এটি স্থাপন করা, এটি পরে রাখার অর্থ শর্তটি পূরণ হলেই এটি ফলাফলের তালিকায় যায়।
লেভন

4
@ হাইট এটি কেবল তালিকা বোধের ভিতরে টেরিনারি অপারেটর ( i < 0 ? 0 : iসি তে) ব্যবহার করছে । এটি পরিষ্কার করার জন্য বন্ধনী রাখুন [(0 if i < 0 else i) for i in a]। তালিকার এক্সপ্রেশনটি নির্মাণের ফিল্টার অংশটি ব্যবহার করে যদি পরে রাখা হয়। [(i) for i in a if i < 0]কেবল শূন্যের চেয়ে কম আইটেমের একটি তালিকা ফিরিয়ে দেবে।
পল এস

4
নম্পি শক্তিশালী কারণ এটি সংকলিত সি কোড দ্বারা প্রচুর গণনা করে এবং এইভাবে দ্রুত হয়। অন্যদের সাথে এই পদ্ধতির তুলনা করে, আমি প্রায় 10 গতির গতির গুণকের পার্থক্য পাই (এটি ধীর)। সুতরাং স্বজ্ঞাত এবং পড়তে সহজ, এটি অবশ্যই গণ্য নিবিড়ের জন্য নয়।
আরএসপেন্সার


2

নুমপি ছাড়াই পাইথনে এটি করার একটি উপায় এখানে। একটি ফাংশন তৈরি করুন যা আপনি যা চান তা ফিরিয়ে দেয় এবং একটি তালিকা বোধগম্য বা মানচিত্রের ফাংশন ব্যবহার করে।

>>> a = [1, 2, 3, -4, 5]

>>> def zero_if_negative(x):
...   if x < 0:
...     return 0
...   return x
...

>>> [zero_if_negative(x) for x in a]
[1, 2, 3, 0, 5]

>>> map(zero_if_negative, a)
[1, 2, 3, 0, 5]

4
এই রুটে নেমে গিয়েছিল তবে ভেবেছিল যে নম্পির সাথে এটি করার একটি সহজ, আরও মাতলাব কম অজগর উপায় থাকতে হবে (কারণ আমি যাইহোক তালিকার চেয়ে অ্যারে ব্যবহার করছিলাম)। ক্লিপটি নিখুঁত
বিএফপি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.