Почему max и min равны numpy array nan? - PullRequest
0 голосов
/ 12 июля 2020

В чем может быть причина, почему максимальные и минимальные значения моего массива numpy равны nan? Я проверил свой массив с помощью:

for i in range(data[0]):
    if data[i] == numpy.nan:
        print("nan")    

И в моих данных нет nan. Мой поиск неверен? Если нет: в чем может быть причина того, что max и min равны nan?

Ответы [ 3 ]

1 голос
/ 12 июля 2020

Здесь вы go:

import numpy as np

a = np.array([1, 2, 3, np.nan, 4])

print(f'a.max() = {a.max()}')
print(f'np.nanmax(a) = {np.nanmax(a)}')

print(f'a.min() = {a.min()}')
print(f'np.nanmin(a) = {np.nanmin(a)}')

Вывод:

a.max() = nan
np.nanmax(a) = 4.0
a.min() = nan
np.nanmin(a) = 1.0
0 голосов
/ 12 июля 2020

Причина в том, что np.nan == x равно всегда Ложь , даже если x равно np.nan. Это согласуется с определением NaN в Википедии .

Проверьте себя:

In [4]: import numpy as np

In [5]: np.nan == np.nan
Out[5]: False

Если вы хотите проверить, является ли число x np.nan, вы должны использовать

np.isnan(x)

Если вы хотите получить max / min массива np. с nan, используйте np.nanmax() / np.nanmin():

minval = np.nanmin(data)
0 голосов
/ 12 июля 2020

Balaji Ambre sh точно показал, как найти min / max , даже если исходный массив содержит NaN , есть нечего добавить по этому поводу.

Но ваш образец кода содержит также другие fl aws, на которые следует обратить внимание.

  1. Ваш l oop содержит for i in range(data[0]):. Вы, вероятно, хотели выполнить это l oop для каждого элемента data , но ваш l oop будет выполняться столько раз, сколько значение начального элемента данные .

    Варианты:

    • Например, 1 , он будет выполнен только один раз.
    • Если это равно 0 или отрицательно, он не будет выполнен вообще.
    • Если он больше, чем размер данных , IndexError исключение будет поднят.
    • Если ваш массив содержит не менее 1 NaN , тогда весь массив имеет тип float ( NaN - это специальный случай float ), и вы получите TypeError исключение: 'numpy .float64' объект не может быть интерпретирован как целое число .

    Remedium (один из возможных вариантов): этот l oop должен начинаться с for elem in data:, а код внутри должен использовать elem как текущий элемент data .

  2. Следующая строка содержит if data[i] == numpy.nan:. Даже если вы исправили его на if elem == np.nan:, код внутри блока if не будет никогда выполняться. Причина в том, что np.nan по определению не равно любому другому значению, даже если это другое значение является другим np.nan .

    Remedium: измените на , если np.isnan (elem): ( Balaji написал в своем комментарии как изменить ваш код, я добавил почему ).

И наконец: как проверить быстро массив на NaN s:

  1. Чтобы получить подробный список, является ли каждый элемент NaN , запустите np.isnan(data), и вы получите массив bool .

  2. Чтобы получить ответ single , содержит ли data хотя бы один NaN , независимо от того, где, запустите np.isnan(data).any().

Этот код короче и работает значительно быстрее.

...