Balaji Ambre sh точно показал, как найти min / max , даже если исходный массив содержит NaN , есть нечего добавить по этому поводу.
Но ваш образец кода содержит также другие fl aws, на которые следует обратить внимание.
Ваш 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 .
Следующая строка содержит if data[i] == numpy.nan:
. Даже если вы исправили его на if elem == np.nan:
, код внутри блока if не будет никогда выполняться. Причина в том, что np.nan по определению не равно любому другому значению, даже если это другое значение является другим np.nan .
Remedium: измените на , если np.isnan (elem): ( Balaji написал в своем комментарии как изменить ваш код, я добавил почему ).
И наконец: как проверить быстро массив на NaN s:
Чтобы получить подробный список, является ли каждый элемент NaN , запустите np.isnan(data)
, и вы получите массив bool .
Чтобы получить ответ single , содержит ли data хотя бы один NaN , независимо от того, где, запустите np.isnan(data).any()
.
Этот код короче и работает значительно быстрее.