অলসতা ছাড়াই পাইথনে একটি পরিবর্তনশীল NaN বরাদ্দ করা


103

বেশিরভাগ ভাষায় একটি NaN ধ্রুবক থাকে আপনি একটি ভেরিয়েবল মান NaN নির্ধারণ করতে ব্যবহার করতে পারেন। অজগরটি নমপি ব্যবহার না করে কি এটি করতে পারে?


1
সি, সি ++, জাভা, সি #, অকামল, এটি অনেক ভাষার একটি অংশ।
জিলিঙ্কা

2
সিএন তে ন্যান, হ'ল NAN; এটি math.hC99 হিসাবে একটি ধ্রুবক সংজ্ঞায়িত । (আমি ভাষাটিকে সেই ভাষা হিসাবে অতি সাম্প্রতিক মানক সংস্করণ বলা ভাল বলে মনে করি Thus সুতরাং "সি" হ'ল সি 11)) -সি ); সি ++ এটা NANভাল, এর রয়েছে যেমন nan(), nanf()এবং nanl(), যদিও আমি একটু কম তারা কি হিসেবে নির্দিষ্ট আছি। double.NaNজাভাতে, Double.NaNসি # তে ...
থানাটোস

উত্তর:


169

হ্যাঁ - ব্যবহার করুন math.nan

>>> from math import nan
>>> print(nan)
nan
>>> print(nan + 2)
nan
>>> nan == nan
False
>>> import math
>>> math.isnan(nan)
True

পাইথন 3.5 এর আগে, কেউ ব্যবহার করতে পারত float("nan")(কেস সংবেদনশীল)।

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

পরিবর্তে, math.isnan(...)কোনও মান NaN কিনা তা নির্ধারণ করার প্রয়োজন হলে ব্যবহার করুন ।

অধিকন্তু, সঠিক শব্দার্থবিদ্যা ==NaN মূল্যের ওপর অপারেশন সূক্ষ্ম বিষয় যখন যেমন ধারক ধরনের ভিতরে দোকান NaN বের করার চেষ্টা হতে পারে listবা dict(অথবা যখন কাস্টম ধারক ধরনের ব্যবহার করে)। আরও তথ্যের জন্য একটি ধারকটিতে NaN উপস্থিতি পরীক্ষা করা দেখুন ।


আপনি পাইথনের দশমিক মডিউল ব্যবহার করে NaN সংখ্যাও তৈরি করতে পারেন :

>>> from decimal import Decimal
>>> b = Decimal('nan')
>>> print(b)
NaN
>>> print(repr(b))
Decimal('NaN')
>>>
>>> Decimal(float('nan'))
Decimal('NaN')
>>> 
>>> import math
>>> math.isnan(b)
True

math.isnan(...) দশমিক অবজেক্টের সাথেও কাজ করবে।


তবে, আপনি পাইথনের ভগ্নাংশ মডিউলে NaN সংখ্যা তৈরি করতে পারবেন না :

>>> from fractions import Fraction
>>> Fraction('nan')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python35\lib\fractions.py", line 146, in __new__
    numerator)
ValueError: Invalid literal for Fraction: 'nan'
>>>
>>> Fraction(float('nan'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python35\lib\fractions.py", line 130, in __new__
    value = Fraction.from_float(numerator)
  File "C:\Python35\lib\fractions.py", line 214, in from_float
    raise ValueError("Cannot convert %r to %s." % (f, cls.__name__))
ValueError: Cannot convert nan to Fraction.

উল্লেখ্য, আপনার কাছে কি করতে পারেন float('Inf'), Decimal('Inf')অথবা math.inf(3.5+) অসীম সংখ্যার দায়িত্ব অর্পণ করা। (এবং আরও দেখুন math.isinf(...))

তবে করা Fraction('Inf')বা Fraction(float('inf'))অনুমোদিত নয় এবং NaN এর মতো একটি ব্যতিক্রমও ছুঁড়ে ফেলবে।

আপনি যদি কোনও নম্বর math.isfinite(...)নাএন এবং অসীম না তা পরীক্ষা করে দেখার জন্য দ্রুত এবং সহজ উপায় চান, আপনি পাইথন ৩.২+ হিসাবে ব্যবহার করতে পারেন ।


আপনি যদি জটিল সংখ্যার সাথে একই রকম চেক করতে চান cmathতবে mathমডিউলটিতে মডিউল হিসাবে একই ধরণের ফাংশন এবং ধ্রুবক রয়েছে :

  • cmath.isnan(...)
  • cmath.isinf(...)
  • cmath.isfinite(...) (পাইথন ৩.২++)
  • cmath.nan(পাইথন ৩.6++ এর সমতুল্য complex(float('nan'), 0.0))
  • cmath.nanj(পাইথন ৩.6++ এর সমতুল্য complex(0.0, float('nan')))
  • cmath.inf(পাইথন ৩.6++ এর সমতুল্য complex(float('inf'), 0.0))
  • cmath.infj(পাইথন ৩.6++ এর সমতুল্য complex(0.0, float('inf')))

2
নোট করুন যে ফ্লোট ('নান) ব্যবহার করা এনপি.নান ব্যবহারের চেয়ে 3x ধীর গতিতে এবং একবার ন্যান = ফ্লোট (' নান ') একবারে নির্ধারণের চেয়ে প্রায় 6.5 গুণ ধীর এবং তারপরে নীচের সমস্ত অ্যাসাইনমেন্টের জন্য ভেরিয়েবল' নান 'ব্যবহার করে (অ্যাবারনার্টের পরামর্শ অনুসারে) উত্তর).
ড্যানিয়েল গোল্ডফার্ব

18
nan = float('nan')

এবং এখন আপনার ধ্রুবক আছে nan,।

দশমিকের জন্য আপনি একইভাবে NaN মান তৈরি করতে পারেন ec

dnan = Decimal('nan')

এটি একাধিক ন্যান কার্যভারের জন্য সবচেয়ে কার্যকরী উত্তর: এটি কেবলমাত্র একবার ভাসা ('নান') ব্যবহার করুন এবং তারপরে সমস্ত অবশিষ্ট অ্যাসাইনমেন্টের জন্য নির্ধারিত ধ্রুবকটি ব্যবহার করুন। তবে আপনি যদি মোট ন্যানের জন্য কেবল এক বা দুটি অ্যাসাইনমেন্টটি করেন তবে নম্পি.নান ব্যবহার করা দ্রুততম।
ড্যানিয়েল গোল্ডফার্ব



6

আপনি "ইনফ - ইনফ" থেকে NaN পেতে পারেন, এবং আপনি 2e308 এর চেয়ে বেশি সংখ্যক থেকে "ইনফ" পেতে পারেন, সুতরাং, আমি সাধারণত ব্যবহার করেছি:

>>> inf = 9e999
>>> inf
inf
>>> inf - inf
nan

3
এই উত্তরটি অযৌক্তিকভাবে কমিয়ে আনা হয়েছে। আমি .txt ফাইলগুলিতে প্রচুর পরিমাণে ছোট ছোট ছোট ছোট ছোট ছোট ছোট ছোট ছোট ছোট ছোট ছোট পরীক্ষামূলক স্ক্রিন টেস্ট লিখছি এবং প্রত্যাশিত আউটপুট অংশ পেতে ast.literal_eval ব্যবহার করছি। সেখানে ভাসমান ('নান') বলা অসম্ভব এবং এই উত্তরটি আমার পক্ষে সহায়ক ছিল।
ভাইটালিক ভারহোভাদভ

0

ইনফ এবং -আইএনএফ উত্পন্ন করার জন্য আরও সামঞ্জস্যপূর্ণ (এবং কম অস্বচ্ছ) উপায় আবার ফ্লোট () ব্যবহার করতে হবে:

>> positive_inf = float('inf')
>> positive_inf
inf
>> negative_inf = float('-inf')
>> negative_inf
-inf

নোট করুন যে কোনও ফ্লোটের আকার আর্কিটেকচারের উপর নির্ভর করে পরিবর্তিত হয়, তাই সম্ভবত 9e999 এর মতো যাদু নম্বর ব্যবহার করা এড়ানো ভাল, এমনকি যদি এটি সম্ভবত কাজ করে তবে।

import sys
sys.float_info
sys.float_info(max=1.7976931348623157e+308,
               max_exp=1024, max_10_exp=308,
               min=2.2250738585072014e-308, min_exp=-1021,
               min_10_exp=-307, dig=15, mant_dig=53,
               epsilon=2.220446049250313e-16, radix=2, rounds=1)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.