Меню

Invalid nan comparison ошибка

As stated by Mathieu in the comments, the error is due to the fact you are beginning at 0 instead of 1:

How do you find that error? First it is telling you there is a NaN comparison. There is only one comparison in your code: XN >= 1.e-9

1e-9 is not NaN, so XN must be. Therefore the error lies on the line XN=(sin(n)**2)/n. There are few ways to get a NaN result, and almost all of them are invalid operations. 0/0 or inf - inf for example.

I suspect you are using numpy.sin and not math.sin. Hence you are working with numpy floats instead of regular python floats. The difference is that on division by 0, python floats raise an error, while by default numpy fails silently and sets the number to NaN.

and to prove it, you can test it:

In : np.sin(0) ** 2 / 0
out : nan

Since you are a beginner, I will tell you other remarks I have on your code:

  1. You’re asked for the list length, but you are returng len(Listtt) - 1, that may be an error
  2. Using a for n in range(9999) here is a suboptimal: it will fail if you need more than 9999 elements. You should use a while loop or an infinite for loop like for n in itertools.count() (and since you need to start at 1, it should be for n in itertools.count(1).
  3. Listtt is a pretty bad variable name (especially if you also have List and Listt, it is going to make your code very confusing to read), you could call it something more explicit like xn_list.

While working on #15255 I found an intermittent (hash-seed dependent) bug when calling checkodesol for a particular ODE:

from sympy.solvers.tests.test_ode import *
from sympy import Ei

eqn = Eq(Derivative(x*Derivative(f(x), x), x)/x, exp(x))
sol = Eq(f(x), C1 + C2*log(x) + exp(x) - Ei(x))
assert checkodesol(eqn, sol, order=2, solve_for_func=False)[0]

Note that the timings are consistently different in the cases where it crashes vs the cases where it doesn’t. Somehow a hash-seed dependent code path is taken long before the point where the exception is raised.

(venv) ~/current/sympy/sympy$ python --version
Python 3.6.2
(venv) ~/current/sympy/sympy$ time PYTHONHASHSEED=0 python rtest.py 

real	0m1.582s
user	0m1.307s
sys	0m0.092s
(venv) ~/current/sympy/sympy$ time PYTHONHASHSEED=1 python rtest.py 
Traceback (most recent call last):
  File "/Users/enojb/current/sympy/sympy/sympy/core/cache.py", line 93, in wrapper
    retval = cfunc(*args, **kwargs)
  File "/Users/enojb/current/sympy/sympy/sympy/core/expr.py", line 78, in sort_key
    args = expr.as_ordered_terms(order=order)
  File "/Users/enojb/current/sympy/sympy/sympy/core/expr.py", line 993, in as_ordered_terms
    terms, gens = self.as_terms()
  File "/Users/enojb/current/sympy/sympy/sympy/core/expr.py", line 1051, in as_terms
    gens = sorted(gens, key=default_sort_key)
  File "/Users/enojb/current/sympy/sympy/sympy/core/expr.py", line 336, in __lt__
    raise TypeError("Invalid NaN comparison")
TypeError: Invalid NaN comparison

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "rtest.py", line 6, in <module>
    assert checkodesol(eqn, sol, order=2, solve_for_func=False)[0]
  File "/Users/enojb/current/sympy/sympy/sympy/solvers/ode.py", line 2472, in checkodesol
    ode_or_bool = simplify(ode_or_bool)
  File "/Users/enojb/current/sympy/sympy/sympy/simplify/simplify.py", line 521, in simplify
    return expr._eval_simplify(ratio=ratio, measure=measure, rational=rational, inverse=inverse)
  File "/Users/enojb/current/sympy/sympy/sympy/core/relational.py", line 217, in _eval_simplify
    elif dif.equals(0):  # XXX this is expensive
  File "/Users/enojb/current/sympy/sympy/sympy/core/expr.py", line 680, in equals
    constant = diff.is_constant(simplify=False, failing_number=True)
  File "/Users/enojb/current/sympy/sympy/sympy/core/expr.py", line 611, in is_constant
    if b is not None and b is not S.NaN and b.equals(a) is False:
  File "/Users/enojb/current/sympy/sympy/sympy/core/expr.py", line 670, in equals
    diff = factor_terms(simplify(self - other), radical=True)
  File "/Users/enojb/current/sympy/sympy/sympy/simplify/simplify.py", line 525, in simplify
    original_expr = expr = signsimp(expr)
  File "/Users/enojb/current/sympy/sympy/sympy/simplify/simplify.py", line 375, in signsimp
    e = sub_post(sub_pre(expr))
  File "/Users/enojb/current/sympy/sympy/sympy/simplify/cse_opts.py", line 15, in sub_pre
    reps = [a for a in e.atoms(Add) if a.could_extract_minus_sign()]
  File "/Users/enojb/current/sympy/sympy/sympy/simplify/cse_opts.py", line 15, in <listcomp>
    reps = [a for a in e.atoms(Add) if a.could_extract_minus_sign()]
  File "/Users/enojb/current/sympy/sympy/sympy/core/expr.py", line 2294, in could_extract_minus_sign
    return bool(self.sort_key() < negative_self.sort_key())
  File "/Users/enojb/current/sympy/sympy/sympy/core/cache.py", line 95, in wrapper
    retval = func(*args, **kwargs)
  File "/Users/enojb/current/sympy/sympy/sympy/core/expr.py", line 78, in sort_key
    args = expr.as_ordered_terms(order=order)
  File "/Users/enojb/current/sympy/sympy/sympy/core/expr.py", line 993, in as_ordered_terms
    terms, gens = self.as_terms()
  File "/Users/enojb/current/sympy/sympy/sympy/core/expr.py", line 1051, in as_terms
    gens = sorted(gens, key=default_sort_key)
  File "/Users/enojb/current/sympy/sympy/sympy/core/expr.py", line 336, in __lt__
    raise TypeError("Invalid NaN comparison")
TypeError: Invalid NaN comparison

real	0m2.252s
user	0m1.971s
sys	0m0.098s

У меня есть датафрейм DF с 2 столбцами

Sub_marks Total_marks
40         90
60         80
100        90
0           0

Мне нужно найти, какие строки не соответствуют критериям sub_marks <= Total_marks. В настоящее время я использую функцию Sympy, как показано ниже

def fn_validate(formula,**args):
    exp=sy.sympify(formula)
    exp=exp.subs(args)
    return exp

Я вызываю вышеуказанную функцию, используя метод apply, как показано ниже

df['val_check']=df.apply(lambda row:fn_validate('X<=Y',X=row['Sub_marks],Y=row['Total_marks']),axis=1)

Я ожидаю столбец val_check с результатами проверки истинности / ложности выражения. Но в случае 0 значений, я получаю ошибку.

Invalid Nan Comparison

Я не могу удалить эти значения из фрейма данных. Пожалуйста, дайте мне знать, есть ли другой способ сделать проверку этого выражения

2 ответа

Лучший ответ

Вы можете попробовать это:

df['val_check'] = df.Sub_marks <= df.Total_marks                                                                                                                                    

 df                                                                                                                                                                                  

   Sub_marks  Total_marks  val_check
0         40           90       True
1         60           80       True
2        100           90      False
3          0            0       True


1

oppressionslayer
22 Дек 2019 в 05:31

Вы можете напрямую сравнивать столбцы и сохранять их в списке.

condition = df['sub_marks']>=df['total_marks']

print(condition)

Выход:

[True,True,False,True]


0

Strange
22 Дек 2019 в 05:33

Questions : Limit NaN comparison

2023-01-25T21:06:32+00:00 2023-01-25T21:06:32+00:00

794

I am a beginner, this is The question:

I have tried:

Listttt=[0]
for n in range(9999):
    
    XN=(sin(n)**2)/n 
    
    if XN >= 1.e-9:
        Listttt.append(XN)

KK=len(Listttt)-1
print(KK)

But it says «Invalid NaN comparison»

Total Answers 1

24

Answers 1 : of Limit NaN comparison

As stated by Mathieu in the comments, post uvdos python the error is due to the fact you are post uvdos python beginning at 0 instead of 1:

How do you find that error? First it is post uvdos python telling you there is a NaN comparison. post uvdos python There is only one comparison in your post uvdos python code: XN >= 1.e-9

1e-9 is not NaN, so XN must be. post uvdos python Therefore the error lies on the line post uvdos python XN=(sin(n)**2)/n. There are few ways to post uvdos python get a NaN result, and almost all of them post uvdos python are invalid operations. 0/0 or inf — inf post uvdos python for example.

I suspect you are using numpy.sin and post uvdos python not math.sin. Hence you are working with post uvdos python numpy floats instead of regular python post uvdos python floats. The difference is that on post uvdos python division by 0, python floats raise an post uvdos python error, while by default numpy fails post uvdos python silently and sets the number to NaN.

and to prove it, you can test it:

In : np.sin(0) ** 2 / 0
out : nan

Since you are a beginner, I will tell post uvdos python you other remarks I have on your code:

  1. You’re asked for the list length, but you are returng len(Listtt) - 1, that may be an error
  2. Using a for n in range(9999) here is a suboptimal: it will fail if you need more than 9999 elements. You should use a while loop or an infinite for loop like for n in itertools.count() (and since you need to start at 1, it should be for n in itertools.count(1).
  3. Listtt is a pretty bad variable name (especially if you also have List and Listt, it is going to make your code very confusing to read), you could call it something more explicit like xn_list.

0

2023-01-25T21:06:32+00:00 2023-01-25T21:06:32+00:00Answer Link

mRahman


  • Type:


    Bug

  • Status:

    Reported


  • Priority:


    P4: Low

  • Resolution:

    Unresolved


  • Affects Version/s:



    5.5.1, 5.12.1

  • Fix Version/s:



    None


  • Platform/s:


    Linux/X11

QVariants comparison (Operator «>») is wrong when containing a «nan»-double value:

How to reproduce:

#include <math.h>
#include <QVariant>
#include <QDebug>

int main()
{
    double a = std::nan("");
    double b = 0;    
    Q_ASSERT(std::isnan(a));    

        qDebug() << "==" << (a==b);     qDebug() << "<"  << (a<b);      qDebug() << ">"  << (a>b);  
        qDebug() << "==" << (QVariant(a) == QVariant(b));     qDebug() << "<"  << (QVariant(a) <  QVariant(b));     qDebug() << ">"  << (QVariant(a) >  QVariant(b));  
        Q_ASSERT((a==b) == (QVariant(a) == QVariant(b)));     Q_ASSERT((a< b) == (QVariant(a) <  QVariant(b)));     Q_ASSERT((a> b) == (QVariant(a) >  QVariant(b))); 
    return 0;
}


No reviews matched the request. Check your Options in the drop-down menu of this sections header.

NaN в JavaScript

От автора: В данной статье мы познакомимся со специальным свойством NaN (Not-A-Number), которое является значением, представляющим не-число.

Тип числа в JavaScript содержит целые числа и числа с плавающей запятой:

const integer = 4;

const float = 1.5;

typeof integer; // => ‘number’

typeof float;   // => ‘number’

Плюс есть два специальных числовых значения: Infinity (число больше, чем любое другое число) и NaN (представляющее концепцию «не число»):

JavaScript. Быстрый старт

Изучите основы JavaScript на практическом примере по созданию веб-приложения

Узнать подробнее

const infinite = Infinity;

const faulty = NaN;

typeof infinite; // => ‘number’

typeof faulty;   // => ‘number’

Хотя непосредственная работа с NaN редко встречается, оно может неожиданно появиться после неудачной операции с числами.

Давайте подробно рассмотрим специальное значение NaN: как проверить, содержит ли переменная NaN, и сценарии, которые в которых генерируется значения «не число».

1. Число NaN

Тип числа в JavaScript — это набор всех числовых значений, включая «не число», положительную бесконечность и отрицательную бесконечность.

«Not A Number» можно получить с помощью специального выражения NaN или как свойство глобального объекта или функции Number:

typeof NaN;        // => ‘number’

typeof window.NaN; // => ‘number’

typeof Number.NaN; // => ‘number’

«Не число» — это значение, которое не представляет действительное число, несмотря на то, что оно имеет тип числа. Через NaN полезно представлять ошибочные операции с числами. Например, умножение числа на undefined не является допустимой операцией, поэтому дает NaN:

Также попытка разобрать недопустимую числовую строку, например, ‘Joker’ приводит к NaN:

parseInt(‘Joker’, 10); // => NaN

2. Проверка на равенство с NaN

Интересным свойством NaN является то, что оно не равно ни одному значению, даже самому себе:

Это поведение полезно для определения, является ли переменная NaN:

const someNumber = NaN;

if (someNumber !== someNumber) {  console.log(‘Is NaN’);

} else {

  console.log(‘Is Not NaN’);

}

// logs «Is NaN»

Выражение someNumber !== someNumber равно true, только если someNumber является NaN. Таким образом, приведенный выше фрагмент регистрирует в консоли «Is NaN». JavaScript содержит встроенные функции для определения NaN: isNaN() и Number.isNaN():

isNaN(NaN); // => true

isNaN(1);   // => false

Number.isNaN(NaN); // => true

Number.isNaN(1);   // => false

Разница между этими функциями заключается в том, что Number.isNaN() не преобразуется свой аргумент в число:

isNaN(‘Joker12’);        // => true

Number.isNaN(‘Joker12’); // => false

isNaN(‘Joker12’) преобразует аргумент ‘Joker12’ в число, которое является NaN. Таким образом, функция возвращает true.

С другой стороны, Number.isNaN(‘Joker12’) проверяет аргумент без преобразования. Функция возвращает false, потому ‘Joker12’ не равно NaN.

3. Операции, дающие NaN

3.1 Парсинг чисел

В JavaScript вы можете преобразовать числовые строки в числа. Например, вы можете легко преобразовать строку ‘1.5’ в число с плавающей запятой 1.5:

const numberString = ‘1.5’;

const number = parseFloat(numberString);

number; // => 1.5

Когда строка не может быть преобразована в число, функция синтаксического анализа возвращает NaN: указывая, что синтаксический анализ не выполнен. Вот некоторые примеры:

JavaScript. Быстрый старт

Изучите основы JavaScript на практическом примере по созданию веб-приложения

Узнать подробнее

parseFloat(‘Joker12.5’); // => NaN

parseInt(‘Joker12’, 10); // => NaN

Number(‘Joker12’);       // => NaN

При парсинге чисел рекомендуется проверить, не является ли результат парсинга NaN:

let inputToParse = ‘Invalid10’;

let number;

number = parseInt(inputToParse, 10);

if (isNaN(number)) {  number = 0;

}

number; // => 0

Парсинг inputToParse не удался, поэтому parseInt(inputToParse, 10) возвращается NaN. Условие if (isNaN(number)) оценивается, как true, и 0 назначается number.

3.2 undefined в качестве операнда

При использовании undefined в качестве операнда в арифметических операциях, таких как сложение, умножение и т д. мы получаем NaN. Например:

function getFontSize(style) {

  return style.fontSize;

}

const fontSize = getFontSize({ size: 16 }) * 2;

const doubledFontSize = fontSize * 2;

doubledFontSize; // => NaN

getFontSize() — это функция, которая обращается к свойству fontSize из объекта стиля. При вызове getFontSize({ size: 16 }) результатом будкт undefined (свойство fontSize не существует в объекте { size: 16 }). fontSize * 2 оценивается как undefined * 2, что дает NaN.

«Not A Number» генерируется, когда в качестве значения в арифметических операциях используется отсутствующее свойство или функция, возвращающая undefined. Отсутствие undefined в арифметических операциях — это хороший способ предотвратить получение NaN.

3.3 NaN как операнд

Значение NaN также генерируется, когда операндом в арифметических операциях является NaN:

1 + NaN; // => NaN

2 * NaN; // => NaN

NaN распространяется на арифметические операции:

let invalidNumber = 1 * undefined;

let result = 1;

result += invalidNumber; // appendresult *= 2;             // duplicate

result++;                // increment

result; // => NaN

Операции с переменной result прерываются после добавления к result значения invalidNumber (которое является NaN).

3.4 Неопределенные формы

Значение NaN создается, когда арифметические операции имеют неопределенные формы. Деление 0 / 0 и Inifinity / Infinity:

0 / 0;               // => NaN

Infinity / Infinity; // => NaN

Умножение 0 и Infinity:

Сложение бесконечных чисел с разными знаками:

Infinity + Infinity; // => NaN

3.5 Неверные аргументы математических функций

Квадратный корень из отрицательного числа:

Math.pow(2, 0.5); // => NaN

(2) ** 0.5;       // => NaN

Или логарифм отрицательного числа:

4. Заключение

Понятие «не число», выраженное в JavaScript с помощью NaN, полезно для представления ошибочных операций над числами. NaN не равно ни одному значению, даже самому себе. Рекомендуемый способ проверить, содержит ли переменная NaN — использовать Number.isNaN(value).

Преобразование числовых строк в числа, в случае неудачи может дать NaN. Рекомендуется проверять, не возвращают ли parseInt(), parseFloat() или Number() NaN.

Если undefined или NaN используются в качестве операнда в арифметических операциях, это обычно приводит к NaN. Правильная обработка undefined (предоставление значений по умолчанию для отсутствующих свойств) является рекомендованным подходом для предотвращения этой ситуации.

Неопределенные формы или недопустимые аргументы для математических функций также приводят получению NaN. Но это случается редко. Вот мой практический совет: «Получили NaN? Ищите undefined!»

Автор: Dmitri Pavlutin

Источник: //dmitripavlutin.com

Редакция: Команда webformyself.

JavaScript. Быстрый старт

Изучите основы JavaScript на практическом примере по созданию веб-приложения

Узнать подробнее

JavaScript. Быстрый старт

Изучите основы JavaScript на практическом примере по созданию веб-приложения

Смотреть

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Invalid keystore format java ошибка
  • Invalid kernel stack address ошибка