পাইথনের সাইন ফাংশন নেই কেন?


241

পাইথনের কেন signফাংশন নেই তা আমি বুঝতে পারি না । এটির একটি absবিল্টিন রয়েছে (যা আমি signবোন হিসাবে বিবেচনা করি ) তবে তা নেই sign

অজগর ২.6 এ এমনকি একটি copysignফাংশন ( গণিতে ) রয়েছে, তবে কোনও চিহ্ন নেই। কেন copysign(x,y)আপনি যখন কেবল একটি লিখতে signপারেন এবং copysignসরাসরি সরাসরি থেকে তা লিখতে কেন বিরক্ত হন abs(x) * sign(y)? পরবর্তীটি আরও স্পষ্ট হবে: এক্স এর সাথে y এর চিহ্ন সহ, অন্যদিকে কপিসাইন দিয়ে আপনাকে মনে রাখতে হবে এটি x এর সাথে y বা y এর চিহ্ন সহ x!

স্পষ্টতই এর sign(x)চেয়ে বেশি কিছু সরবরাহ করা হয় না cmp(x,0)তবে এটি আরও বেশি পঠনযোগ্য হবে যে এটিও (এবং পাইথনের মতো বহুল পঠনযোগ্য ভাষার জন্য এটি একটি বৃহত্তর প্লাস হত)।

আমি যদি পাইথন ডিজাইনার হয়ে থাকতাম তবে আমি অন্য উপায়ে cmpঅর্ডিন হয়ে থাকতাম: বিল্টিন না, তবে একটি sign। আপনার যখন প্রয়োজন হবে cmp(x,y), আপনি কেবল একটি sign(x-y)(বা, সংখ্যাগত স্টাফের জন্য আরও ভাল, কেবলমাত্র একটি এক্স> ওয়াই) করতে পারতেন - অবশ্যই এটি sortedএকটি পূর্ণসংখ্যার তুলকের পরিবর্তে বুলিয়ান গ্রহণ করা উচিত ছিল )। এটাও আরো স্পষ্ট হবে: ইতিবাচক যখন x>y(যেহেতু সঙ্গে cmpআপনি কনভেনশন ইতিবাচক মনে রাখা যখন আছে প্রথম হল বড় , কিন্তু এটা অন্য উপায় কাছাকাছি হতে পারে)। অবশ্যই cmpঅন্যান্য কারণে এর নিজস্ব ধারণাটি তৈরি করে (উদাহরণস্বরূপ যখন অ-সংখ্যাসূচক জিনিসগুলি বাছাই করার সময়, বা যদি আপনি সাজ্টটি স্থিতিশীল হতে চান যা কেবল বুলিয়ান দিয়ে ব্যবহার করা সম্ভব নয়)

সুতরাং, প্রশ্নটি হল: পাইথন ডিজাইনার (গুলি) কেন signভাষাটির বাইরে ফাংশনটি ছেড়ে যাওয়ার সিদ্ধান্ত নিয়েছিলেন ? কেন হেক copysignতার পিতামাতার সাথে বিরক্ত হয় না sign?

আমি কিছু অনুপস্থিত করছি?

সম্পাদনা - পিটার হ্যানসেন মন্তব্য করার পরে। যথেষ্ট পরিমাণে আপনি এটি ব্যবহার করেন নি তবে আপনি অজগরটি কী ব্যবহার করেন তা আপনি বলেননি। 7 বছরে আমি অজগর ব্যবহার করি, আমার এটি অসংখ্যবার প্রয়োজন হয়েছিল, এবং শেষটিটি খড়টি যা উটের পিঠে ভেঙে দেয়!

হ্যাঁ, আপনি চারপাশে সিএমপি পাস করতে পারেন, তবে আমার যে সময়টি পাস করার প্রয়োজন ছিল তার 90% সময়টি ছিল ঠিক lambda x,y: cmp(score(x),score(y))এমন একটি প্রতিমা হিসাবে ছিল যে সাইন দিয়ে ঠিক কাজ করেছিল।

পরিশেষে, আমি আশা করি আপনি সম্মত হন যে এর signচেয়েও বেশি কার্যকর হবে copysign, তাই আমি যদি আপনার দৃষ্টিভঙ্গি কিনেছি, কেন সাইন এর পরিবর্তে গণিতে এটি সংজ্ঞায়িত করার বিষয়ে কেন বিরক্ত করবেন? কীভাবে স্বাক্ষরের চেয়ে অনুলিপি ব্যবহার করা যায়?


33
@ ডমাজ্জনি: এই যুক্তিটি কি এই সাইটের সমস্ত প্রশ্নের জন্য কাজ করবে না? কেবল স্ট্যাকওভারফ্লো বন্ধ করুন এবং প্রাসঙ্গিক বিষয়ে ডেভ বা ব্যবহারকারী মেলিং তালিকায় প্রতিটি প্রশ্ন জিজ্ঞাসা করুন!
ডেভিড

43
একটি প্রশ্নের যথাযথ জায়গা হ'ল এমন কোনও জায়গা যেখানে এটির উত্তর দেওয়ার সম্ভাবনা রয়েছে। সুতরাং, স্ট্যাকওভারফ্লো একটি উপযুক্ত জায়গা।
স্টেফানো বোরিনি

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

31
প্রশ্নটি কিছুটা আবেগযুক্ত হতে পারে তবে আমি মনে করি এটি খারাপ প্রশ্ন নয়। আমি নিশ্চিত যে প্রচুর লোক একটি অন্তর্নির্মিত সাইন ফাংশনটি সন্ধান করেছে, সুতরাং এটি কেন কৌতূহলী হতে পারে যে কেন এটি নেই।
ফোগলবার্ড

17
এটি একটি নিখুঁত উদ্দেশ্যমূলক প্রশ্ন: "কেন" পাইথনের কোনও নির্দিষ্ট বৈশিষ্ট্যের অভাব রয়েছে তা ভাষা নকশার ইতিহাস সম্পর্কে একটি বৈধ জিজ্ঞাসা যা পাইথন-দেব বা অন্যান্য ফোরামে (কখনও কখনও ব্লগ পোস্টগুলি) পাইথন থেকে উপযুক্ত আলোচনার সাথে যুক্ত হয়ে উত্তর দেওয়া যেতে পারে where মূল বিকাশকারীরা একটি বিষয় হ্যাশ করতে ঘটে। এর আগে গুগলের কাছে অজগর-দেবের ইতিহাসের বিটগুলির জন্য চেষ্টা করার পরে, আমি বুঝতে পারি যে ভাষার একজন আগত ব্যক্তি কেন একটি মৃতপ্রায় আঘাত হানতে পারে এবং আরও অভিজ্ঞ পাইথন ব্যক্তি উত্তর দেওয়ার আশায় এখানে জিজ্ঞাসা করতে পারে!
ব্র্যান্ডন রোডস

উত্তর:


228

সম্পাদনা করুন:

প্রকৃতপক্ষে সেখানে একটি ছিল প্যাচ যার মধ্যে sign()মধ্যে গণিত , কিন্তু এটা গৃহীত হয়নি, কারণ তারা রাজি হননি কি সব প্রান্ত ক্ষেত্রে ফেরত পাঠাবেন (+/- 0, +/- নান, ইত্যাদি)

সুতরাং তারা কেবল কপিসাইন প্রয়োগ করার সিদ্ধান্ত নিয়েছে, যা শেষ ব্যবহারকারীকে প্রান্তের ক্ষেত্রে পছন্দসই আচরণটি ব্যবহার করতে ব্যবহার করা যেতে পারে - যা কখনও কখনও কল করার প্রয়োজন হতে পারেcmp(x,0)


আমি জানি না কেন এটি অন্তর্নির্মিত নয় তবে আমার কিছু চিন্তা আছে।

copysign(x,y):
Return x with the sign of y.

সবচেয়ে বড় কথা copysignহ'ল একজন সুপারস্টার sign! copysignএক্স = 1 দিয়ে কল করা কোনও signফাংশনের সমান । সুতরাং আপনি এটি ব্যবহার করতে copysignএবং এটি সম্পর্কে ভুলে যেতে পারে ।

>>> math.copysign(1, -4)
-1.0
>>> math.copysign(1, 3)
1.0

আপনি যদি দুটি পুরো আর্গুমেন্ট পাস করে অসুস্থ হয়ে পড়ে থাকেন তবে আপনি এই পদ্ধতিটি প্রয়োগ করতে পারেন signএবং এটি এখনও অন্যের দ্বারা উল্লিখিত আইইইই স্টাফের সাথে সামঞ্জস্যপূর্ণ হবে:

>>> sign = functools.partial(math.copysign, 1) # either of these
>>> sign = lambda x: math.copysign(1, x) # two will work
>>> sign(-4)
-1.0
>>> sign(3)
1.0
>>> sign(0)
1.0
>>> sign(-0.0)
-1.0
>>> sign(float('nan'))
-1.0

দ্বিতীয়ত, সাধারণত যখন আপনি কোনও কিছুর সাইন চান, আপনি কেবল এটি অন্য মান দিয়ে গুণতে শুরু করেন। এবং অবশ্যই এটি মূলত যা copysignকরে।

সুতরাং, পরিবর্তে:

s = sign(a)
b = b * s

আপনি ঠিক করতে পারেন:

b = copysign(b, a)

এবং হ্যাঁ, আমি আশ্চর্য হয়েছি আপনি 7 বছর ধরে পাইথন ব্যবহার করছেন এবং মনে হয় cmpএত সহজে মুছে ফেলা এবং প্রতিস্থাপন করা যেতে পারে sign! আপনি কি কখনও কোনও __cmp__পদ্ধতি সহ কোনও ক্লাস প্রয়োগ করেননি ? আপনি কি কখনও cmpকাস্টম তুলনামূলক ফাংশন কল এবং নির্দিষ্ট করেন নি ?

সংক্ষেপে, আমি নিজেকেও একটি signফাংশন চাইতে পেয়েছি , তবে copysignপ্রথম যুক্তিটি 1 হওয়ার সাথে ঠিক কাজ করবে। আমি এটির signচেয়েও বেশি কার্যকর হবে বলে আমি একমত নই copysign, কারণ আমি দেখিয়েছি যে এটি কেবল একই কার্যকারিতার একটি উপসেট।


35
ব্যবহার [int(copysign(1, zero)) for zero in (0, 0.0, -0.0)]করে [1, 1, -1]। যে হওয়া উচিত ছিল [0, 0, 0]অনুযায়ী en.wikipedia.org/wiki/Sign_function
user238424

12
@ অ্যান্ড্রু - @ ব্যবহারকারী 238424 এর কলিং অর্ডারটি সঠিক। copysign(a,b)বি এর চিহ্ন সহ একটি প্রদান করে - বি হ'ল বিবিধ ইনপুট, খ এর চিহ্ন সহকারে স্বাভাবিক হওয়ার মান। সেক্ষেত্রে, মন্তব্যকারী এই চিহ্নটি (x, x) এর চিহ্ন হিসাবে প্রতিলিপি হিসাবে (1, এক্স) ব্যর্থ হয়েছে, কারণ এটি x = 0 এর জন্য 1 প্রদান করবে, যেখানে চিহ্ন (0) 0 এ মূল্যায়ন করবে।
পলমিসজি

7
ফ্লোটগুলি "চিহ্ন" "মান" থেকে পৃথক করে; -0.0 হ'ল একটি নেতিবাচক সংখ্যা, এমনকি যদি এটি বাস্তবায়নের ত্রুটি বলে মনে হয়। সহজভাবে ব্যবহার করা cmp()পছন্দসই ফলাফলগুলি দেবে, সম্ভবত প্রায় প্রতিটি ক্ষেত্রেই যে কারও সম্পর্কে যত্নশীল: [cmp(zero, 0) for zero in (0, 0.0, -0.0, -4, 5)]==> [0, 0, 0, -1, 1]
পাইথোনালারি

11
s = sign(a) b = b * sসমান নয় b = copysign(b, a)! এটি খ এর চিহ্ন বিবেচনা করে না। উদাহরণস্বরূপ, যদি a=b=-1প্রথম কোডটি 1 ফিরে আসে এবং দ্বিতীয়টি ফিরে আসে -1
জোহানেস জেন্ডারসি

14
মিথ্যা সাইন () প্রতিস্থাপন সংজ্ঞা, চিহ্ন (ক) দিয়ে গুণনের জন্য মিথ্যা সমতুল্য, কপিসাইন-এর অনুপ্রেরণার জন্য মিথ্যা ব্যাখ্যা এবং সঠিক প্রতিস্থাপন "সিএমপি (x, 0)" ইতিমধ্যে প্রশ্নের মধ্যে উল্লেখ করা হয়েছে - আছে খুব বেশি তথ্য নয় এবং এটি আমার কাছে অস্পষ্ট যে এত ভোটের সাথে কেন এটি "গৃহীত" উত্তর।?
kxr

59

"কপিসাইন" আইইইই 754 দ্বারা সংজ্ঞায়িত করা হয়েছে এবং সি 99 স্পেসিফিকেশনের অংশ। এজন্য পাইথনে রয়েছে। ফাংশনটি পূর্ণাঙ্গভাবে প্রয়োগ করা যাবে না অ্যাবস (এক্স) * চিহ্ন (y) এর কারণে এটি কীভাবে এনএন মানগুলি হ্যান্ডেল করবে।

>>> import math
>>> math.copysign(1, float("nan"))
1.0
>>> math.copysign(1, float("-nan"))
-1.0
>>> math.copysign(float("nan"), 1)
nan
>>> math.copysign(float("nan"), -1)
nan
>>> float("nan") * -1
nan
>>> float("nan") * 1
nan
>>> 

এটি কপিসাইন () কে সাইন () এর চেয়ে বেশি কার্যকর ফাংশন করে তোলে।

আইইইইর সাইনবিট (এক্স) স্ট্যান্ডার্ড পাইথনে কেন উপলব্ধ নয় তা সুনির্দিষ্ট কারণ হিসাবে আমি জানি না। আমি অনুমান করতে পারি, তবে এটি অনুমান করা হবে।

গণিত মডিউল নিজেই কপিসাইন (1, এক্স) ব্যবহার করে এক্সটি নেতিবাচক বা অ-নেতিবাচক কিনা তা পরীক্ষা করার জন্য। বেশিরভাগ ক্ষেত্রে গাণিতিক ক্রিয়াকলাপগুলির সাথে ডিল করা যা একটি চিহ্ন (x) থাকার চেয়ে বেশি কার্যকর বলে মনে হয় যা 1, 0, বা -1 ফেরায় কারণ বিবেচনার চেয়েও কম কেস রয়েছে। উদাহরণস্বরূপ, পাইথনের গণিত মডিউলটি থেকে নিম্নলিখিত:

static double
m_atan2(double y, double x)
{
        if (Py_IS_NAN(x) || Py_IS_NAN(y))
                return Py_NAN;
        if (Py_IS_INFINITY(y)) {
                if (Py_IS_INFINITY(x)) {
                        if (copysign(1., x) == 1.)
                                /* atan2(+-inf, +inf) == +-pi/4 */
                                return copysign(0.25*Py_MATH_PI, y);
                        else
                                /* atan2(+-inf, -inf) == +-pi*3/4 */
                                return copysign(0.75*Py_MATH_PI, y);
                }
                /* atan2(+-inf, x) == +-pi/2 for finite x */
                return copysign(0.5*Py_MATH_PI, y);

সেখানে আপনি স্পষ্ট দেখতে পাচ্ছেন যে ক্যাপিসাইন () একটি ত্রি-মূল্যযুক্ত চিহ্ন () ফাংশনের চেয়ে আরও কার্যকর ফাংশন।

তুমি লিখেছিলে:

আমি যদি পাইথন ডিজাইনার হয়ে থাকতাম তবে আমি অন্য উপায়ে থাকতাম: কোনও সিএমপি () অন্তর্নির্মিত নয়, তবে একটি চিহ্ন ()

তার মানে আপনি জানেন না যে সিএমপি () সংখ্যা ছাড়াও জিনিসগুলির জন্য ব্যবহৃত হয়। cmp ("এটি", "সেই") একটি সাইন () ফাংশন দিয়ে প্রয়োগ করা যায় না।

আমার অতিরিক্ত উত্তর অন্যত্র জমা করতে সম্পাদনা করুন :

আপনি কীভাবে অ্যাবস () এবং সাইন () প্রায়শই একসাথে দেখা যায় তার ভিত্তিতে আপনার ন্যায্যতার ভিত্তি স্থাপন করেন। সি স্ট্যান্ডার্ড লাইব্রেরিতে কোনও ধরণের 'চিহ্ন (x)' ফাংশন না থাকায় আপনি কীভাবে আপনার মতামতকে ন্যায়সঙ্গত করেন তা আমি জানি না। এখানে একটি অ্যাবস (ইনট) এবং ফাবস (ডাবল) এবং ফাবসফ (ফ্লোট) এবং ফাবসএল (দীর্ঘ) রয়েছে তবে চিহ্নের কোনও উল্লেখ নেই। এখানে "কপিসাইন ()" এবং "সাইনব্যাট ()" রয়েছে তবে সেগুলি কেবল আইইইই 754 নম্বরে প্রয়োগ হয়।

জটিল সংখ্যার সাথে পাইথনে কী কী (-3 + 4 জ) প্রত্যাবর্তন হবে, তা কি বাস্তবায়ন করা হত? অ্যাবস (-3 + 4 জ) ফিরে 5.0। এটি এমন জায়গাগুলিতে কীভাবে অ্যাবস () ব্যবহার করা যেতে পারে তার একটি স্পষ্ট উদাহরণ যেখানে সাইন () কোনও অর্থ দেয় না।

ধরুন অ্যাবস (এক্স) এর পরিপূরক হিসাবে পাইথনের সাথে চিহ্ন (x) যুক্ত করা হয়েছে। যদি 'এক্স' হ'ল কোনও ব্যবহারকারী-সংজ্ঞায়িত শ্রেণীর উদাহরণ যা __abs __ (স্ব) পদ্ধতি প্রয়োগ করে তবে অ্যাবস (এক্স) x .__ অ্যাবস __ () কল করবে। সঠিকভাবে কাজ করতে, একইভাবে অ্যাবস (এক্স) পরিচালনা করতে পাইথনকে একটি চিহ্ন (এক্স) স্লট পেতে হবে।

অপেক্ষাকৃত অপ্রয়োজনীয় ফাংশনের জন্য এটি অতিরিক্ত। তদ্ব্যতীত, কেন সাইন (এক্স) উপস্থিত থাকতে হবে এবং ননজেগিটিভ (এক্স) এবং ননপোসিটিভ (এক্স) এর উপস্থিতি নেই? পাইথনের গণিত মডিউল বাস্তবায়ন থেকে আমার স্নিপেট দেখায় যে কীভাবে কপিবিট (x, y) নননিজেটিভ () প্রয়োগ করতে ব্যবহার করা যেতে পারে, যা একটি সাধারণ চিহ্ন (এক্স) করতে পারে না।

পাইথনের আইইইই 754 / সি 99 গণিত ফাংশনের জন্য আরও ভাল সমর্থন করা উচিত। এটি একটি সাইনব্যাট (এক্স) ফাংশন যুক্ত করবে, যা ভাসমানদের ক্ষেত্রে আপনি যা চান তা করবে। এটি পূর্ণসংখ্যার বা জটিল সংখ্যার জন্য, খুব কম স্ট্রিংয়ের জন্য কাজ করবে না এবং এটির নামটি আপনি সন্ধান করছেন না।

আপনি "কেন" জিজ্ঞাসা করেন এবং উত্তরটি "চিহ্ন (এক্স) কার্যকর নয়।" আপনি দৃ as়ভাবে বলছেন যে এটি দরকারী। তবুও আপনার মন্তব্যগুলি দেখায় যে আপনি এই দাবিটি করতে সক্ষম হবেন এমন যথেষ্ট জানেন না, যার অর্থ আপনাকে এর প্রয়োজনের দৃ conv়প্রত্যয়ী প্রমাণ দেখাতে হবে। NumPy এটি প্রয়োগ করে বলেছে এটি যথেষ্ট বিশ্বাসযোগ্য নয়। সাইন ফাংশন দিয়ে কীভাবে বিদ্যমান কোডটি উন্নত হবে তার ক্ষেত্রে আপনার কেস দেখাতে হবে।

এবং এটি স্ট্যাকওভারফ্লোয়ের সুযোগের বাইরে। এর পরিবর্তে পাইথন তালিকার একটিতে যান।


5
ঠিক আছে, আমি আপনাকে তা খুশি করব না, তবে পাইথন 3-তে cmp()নাও আছে sign():-)
এন্টোইন পি।

4
আইইইই 754 এর সাথে সঠিকভাবে কাজ করবে এমন একটি ভাল সাইন () ফাংশন লেখা তুচ্ছ নয়। এটিকে ভাষায় অন্তর্ভুক্ত করার চেয়ে এটি উত্তম পয়েন্ট হবে, যদিও আমি এই প্রশ্নটিতে এই
বিষয়টির

2
"আপনি যদি এই সাজ্টটিকে স্থিতিশীল রাখতে চান" সে সম্পর্কে আপনার মন্তব্যের অর্থ আপনি স্থিতিশীল সাজান কীভাবে কাজ করে তাও জানেন না। আপনার বিবৃতি যা অনুলিপি এবং স্বাক্ষর সমতুল্য দেখায় যে আপনি এই পোস্টের আগে আইইইই 754 গণিত সম্পর্কে বেশি জানেন না। পাইথন 7550 গণিত ফাংশন মূলত প্রয়োগ করা উচিত? এটি নন-সি 99 সংকলকগুলির জন্য কী করা উচিত? 754 নন প্ল্যাটফর্ম? "আইসোননিজেটিভ" এবং "আইসনপোসিটিভ" এছাড়াও কার্যকর ফাংশন। পাইথনেও কি সেগুলি অন্তর্ভুক্ত করা উচিত? অ্যাবস (এক্স) x .__ অ্যাবস __ () এ স্থগিত হয়, সুতরাং (x) কে x .__ সাইন __ () সাইন করতে হবে? এর চাহিদা বা চাহিদা খুব কমই আছে, তবে কেন এটি কেন আটকে থাকবে?
অ্যান্ড্রু ডালক

2
math.copysign (1, ভাসা ("- নান")) আমি ২.7 এ চেষ্টা করার সময় -1.0 এর পরিবর্তে 1.0 প্রদান করে
ড্যান্সালমো

34

চিহ্নের জন্য অন্য একটি লাইনার ()

sign = lambda x: (1, -1)[x<0]

আপনি যদি এটি x = 0 এর জন্য 0 ফেরত চান

sign = lambda x: x and (1, -1)[x<0]

1
কেন? প্রশ্ন নিজেই স্বীকৃতি দেয় যে cmp(x, 0)এটির সমতুল্য sign, এবং lambda x: cmp(x, 0)আপনার পরামর্শের চেয়ে বেশি পঠনযোগ্য।
টুলমেকারস্টেভ

1
আসলে, আমি ভুল ছিল। আমি ধরে নিয়েছিলাম যে 'সিএমপি' -1,0, + 1 ফেরতের জন্য নির্দিষ্ট করা হয়েছিল, তবে আমি দেখতে পাচ্ছি যে অনুমানটি এর গ্যারান্টি দেয় না।
টুলমেকারস্টেভ

সুন্দর। শুরু হওয়া প্রশ্নের উত্তর দেয়: পাইথন ইনট বা ভাসমান -1, 0, 1?
scharfmn

1
পরিবর্তে তালিকা ব্যবহার করে কি কোনও সুবিধা আছে -1 if x < 0 else 1?
মতিন উলহাক

6
sign = lambda x: -1 if x < 0 else 1হয় 15% দ্রুত । একই সাথে sign = lambda x: x and (-1 if x < 0 else 1)
মতিন উলহাক

26

যেহেতু সরানোcmp হয়েছে , আপনি একই কার্যকারিতাটি পেতে পারেন

def cmp(a, b):
    return (a > b) - (a < b)

def sign(a):
    return (a > 0) - (a < 0)

এটি এমনকি float, intএমনকি জন্য কাজ করে Fraction। ক্ষেত্রে floatনোটিশ sign(float("nan"))শূন্য।

পাইথনের প্রয়োজন নেই যে তুলনাগুলি একটি বুলিয়ান ফেরত দেয়, এবং তাই তুলনা জোর করে বুল () অনুমোদনযোগ্য, কিন্তু অস্বাভাবিক বাস্তবায়ন থেকে রক্ষা করে:

def sign(a):
    return bool(a > 0) - bool(a < 0)

13

উইকিপিডিয়া সংজ্ঞা অনুসারে শুধুমাত্র সঠিক উত্তর

উইকিপিডিয়ায় সংজ্ঞা লেখা আছে:

সাইন সংজ্ঞা

তাই,

sign = lambda x: -1 if x < 0 else (1 if x > 0 else (0 if x == 0 else NaN))

যা সমস্ত উদ্দেশ্য এবং উদ্দেশ্যে এর জন্য সরলীকৃত হতে পারে:

sign = lambda x: -1 if x < 0 else (1 if x > 0 else 0)

এই ফাংশন সংজ্ঞাটি দ্রুত সম্পাদন করে এবং 0, 0.0, -0.0, -4 এবং 5 (অন্যান্য ভুল উত্তরের মন্তব্য দেখুন) এর গ্যারান্টিযুক্ত সঠিক ফলাফল দেয়

মনে রাখবেন যে শূন্য (0) না ইতিবাচক বা নেতিবাচক


1
এই উত্তরটি বোঝায় যে সংক্ষিপ্ত অথচ শক্তিশালী অজগরটি কীভাবে হতে পারে।
নেলসনগন

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

1
@ জারজেন স্ট্রোবেল আপনার অর্থ কী তা আমি ঠিক জানি এবং আমি দীর্ঘকাল এই বিষয়টি নিয়েও চিন্তা করে চলেছি। বেশিরভাগ ব্যবহারের ক্ষেত্রে সহজ সরল সংস্করণ বজায় রেখে সঠিক আনুষ্ঠানিকতার জন্য আমি উত্তরটি এখনই প্রসারিত করেছি।
সার্জ স্ট্রোব্যা্যান্ড্ট

10

নিম্পির একটি সাইন ফাংশন রয়েছে এবং আপনাকে অন্যান্য ফাংশনগুলির বোনাসও দেয়। তাই:

import numpy as np
x = np.sign(y)

ফলাফলটি একটি numpy.float64 হয় তা কেবল সাবধান হন:

>>> type(np.sign(1.0))
<type 'numpy.float64'>

জসন এর মতো জিনিসের জন্য এটি গুরুত্বপূর্ণ, কারণ জসন কীভাবে numpy.float64 ধরণের সিরিয়ালাইজ করতে হয় তা জানে না। সেক্ষেত্রে, আপনি এটি করতে পারেন:

float(np.sign(y))

একটি নিয়মিত ভাসা পেতে।


10

এটি চালানোর চেষ্টা করুন, যেখানে x কোনও সংখ্যা

int_sign = bool(x > 0) - bool(x < 0)

তুলিতে জোর করা () জোর করে তুলনা অপারেটর কোনও বুলিয়ান না ফেরায় এমন সম্ভাবনাটি পরিচালনা করে ।


ভাল ধারণা, তবে আমি মনে করি আপনি বোঝাতে চাইছেন: int_sign = int (x> 0) - int (x <0)
yucer

আমি বলতে চাইছি: int_sign = ল্যাম্বদা এক্স: (x> 0) - (x <0)
yucer

1
@ যাইহোক না, তিনি সত্যই বোঝাতে চেয়েছিলেন কুলটিকে (যা যাইহোক ইন্টের একটি সাবক্লাস), তাত্ত্বিক সম্ভাবনার কারণেই তিনি ব্যাখ্যাটির লিঙ্কটি দিয়েছেন।
ওয়াল্টার ট্রস

এই কনস্ট্রাক্টের একমাত্র নেতিবাচক
দিকটি হ'ল

5

হ্যাঁ একটি সঠিক sign()ফাংশন কমপক্ষে গণিতের মডিউলে থাকতে হবে - যেমনটি অসাধারণ। কারণ গণিতমুখী কোডের জন্য একজনের প্রায়শই এটির প্রয়োজন হয়।

তবে math.copysign()এটি স্বাধীনভাবেও কার্যকর।

cmp()এবং obj.__cmp__()... সাধারণত স্বাধীনভাবে উচ্চ গুরুত্ব আছে। শুধু গণিতমুখী কোডের জন্য নয়। টিপলস, তারিখের অবজেক্টগুলি, তুলনা / সাজানোর বিবেচনা করুন ...

বাদ পড়ার বিষয়ে http://bugs.python.org/issue1640 এ দেব যুক্তিগুলি math.sign()বিজোড়, কারণ:

  • আলাদাও নেই -NaN
  • sign(nan) == nan উদ্বেগ ছাড়াই (মত exp(nan))
  • sign(-0.0) == sign(0.0) == 0 উদ্বেগ ছাড়াই
  • sign(-inf) == -1 উদ্বেগ ছাড়াই

- এটি অদ্ভুত হিসাবে


4

পাইথন 2 এ, cmp()একটি পূর্ণসংখ্যা ফেরত দেয়: ফলাফল -1, 0, বা 1 হওয়ার কোনও প্রয়োজন নেই, তাই sign(x)একই রকম হয় না cmp(x,0)

পাইথন 3 এ cmp()সমৃদ্ধ তুলনার পক্ষে সরানো হয়েছে। কারণ cmp(), পাইথন 3 এটিকে পরামর্শ দেয় :

def cmp(a, b):
    return (a > b) - (a < b)

যা সিএমপি () এর জন্য জরিমানা, তবে আবার সাইন () ব্যবহারের জন্য ব্যবহার করা যাবে না কারণ তুলনা অপারেটরদের বুলিয়ান ফেরত আসতে হবে না ।

এই সম্ভাবনাটি মোকাবেলা করার জন্য, তুলনার ফলাফলগুলি বুলিয়ানদের কাছে জোর করা উচিত:

 def sign(a):
    return bool(x > 0) - bool(x < 0)

এটি typeসম্পূর্ণরূপে অর্ডার করা (যেগুলির মতো বিশেষ মান NaNবা ইনফিনিটি সহ ) এর জন্য কাজ করে।


0

আপনার একটি প্রয়োজন নেই, আপনি কেবল এটি ব্যবহার করতে পারেন:

If not number == 0:
    sig = number/abs(number)
else:
    sig = 0

4
এতে উল্লেখ করা যায় যে 0 x / abs(x)টির if/elseকোন দিকটি রয়েছে তা পরীক্ষা করার জন্য চেইন করার চেয়ে কিছুটা বেশি সময় নেয় , বা সেই বিষয়টির জন্য মানগুলি return (x > 0) - (x < 0)বিয়োগ করার জন্য boolএবং int

1
পাইথন একইরূপে Trueএবং Falseযেমন 1এবং 0, আপনি একেবারে এই কাজ এবং হয় পেতে পারেন 1, 0অথবা -1def sign(x): return (x > 0) - (x < 0)একটি ফিরবে না bool, এটি একটি ফিরে আসবেন int- আপনি পাস 0আপনি পাবেন 0ফিরে


-8

"সাইন" অন্তর্ভুক্ত না হওয়ার কারণটি হ'ল আমরা যদি অন্তর্নির্মিত ফাংশনগুলির তালিকায় প্রতিটি দরকারী ওয়ান-লাইনার অন্তর্ভুক্ত করি তবে পাইথন আর কাজ করা সহজ এবং ব্যবহারিক হবে না। আপনি যদি এই ফাংশনটি প্রায়শই ব্যবহার করেন তবে আপনি কেন এটি ফ্যাক্টরটি করেন না? এটি দূরবর্তীরূপে শক্ত বা এটি করা এমনকি ক্লান্তিকর মতো নয়।


6
ঠিক আছে, আমি এগুলি কেবল তখনই abs()বাদ দিয়ে রাখতাম buy sign()এবং abs()প্রায়শই একসাথে ব্যবহার করা হয়, sign()দুটি (আইএমও) এর মধ্যে সবচেয়ে দরকারী, এবং বাস্তবায়নের জন্য কোনওটিই দূর থেকে শক্ত বা ক্লান্তিকর নয় (যদিও এটির ত্রুটিযুক্ত হলেও, উত্তরটি কীভাবে এটি ভুল হয়ে যায় তা দেখুন: stackoverflow.com/questions/1986152/… )
ডেভিড

1
জিনিসটি হ'ল sign()নিজের সংখ্যাগত ফলটি খুব কমই কার্যকর। আপনি বেশিরভাগ সময় যা করেন তা হ'ল ভেরিয়েবলটি ইতিবাচক বা নেতিবাচক কিনা তার উপর ভিত্তি করে বিভিন্ন কোড পাথ গ্রহণ করা হয় এবং সেক্ষেত্রে স্পষ্টত শর্তটি লিখতে আরও পঠনযোগ্য।
এন্টোইন পি।

3
একটি চিহ্ন () হওয়ার চেয়ে অনেক বেশি ব্যবহৃত হয় অ্যাবস ()। এবং আমি আপনাকে NumPy ট্র্যাকারের দিকে ইঙ্গিত করেছি যা দেখায় যে কার্যকর চিহ্ন () প্রয়োগ করা কতটা কঠিন। (-3 + 4j) সাইন ইন করা উচিত? যখন অ্যাবস (-3 + 4 জ) 5.0। আপনি এমন দৃ make় বক্তব্য রাখেন যে সাইন () এবং অ্যাবস () প্রায়শই একসাথে দেখা যায়। সি স্ট্যান্ডার্ড লাইব্রেরিতে একটি 'সাইন' ফাংশন নেই, তাই আপনি কোথায় আপনার ডেটা পাচ্ছেন?
অ্যান্ড্রু ডাল্ক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.