Я переношу процедуру вертикальной интерполяции из Fortran 77 в NumPy. Я стремлюсь к побитовой четности (средняя абсолютная ошибка (\около 10^{-16})) с выводом gfortran, который использует ДВОЙНУЮ ТОЧНОСТЬ. В моей реализации NumPy я сталкиваюсь с предупреждением RuntimeWarning: деление на ноль, обнаруженным в журнале. Я понимаю, что это связано с тем, что np.where быстро оценивает обе ветви x и y, попадая в заполнители 0,0 или -9999,0 в моих «неактивных» ячейках сетки перед применением маски.
Исходная логика F77
IF (ABS (PSFC (I, J) - PRES (K_IN)) .lt. 0.01) then
PMID = PRES (K_IN)
PUP = PRES (K_IN + 1)
SMID = SPRES (I, J, K_IN)
SUP = SPRES (I, J, K_IN + 1)
LNP1P2 = LNPU1P(K_IN)
LNP1P3 = LOG (PUP / PDWN)
LNP2P3 = LOG (PMID / PDWN)
Моя текущая попытка NumPy (вызывает предупреждение):
l13[active] = np.where(c1_3d, np.log(pup/pdwn), lnpu2p[k])[active]
Мое ограничение:
Я должен поддерживать (10^{-16}) MAE. Простое использование np.seterr(divide='ignore') неприемлемо. Я подозреваю, что вычисление журнала ненужных данных - даже если они отброшены - может незаметно повлиять на флаги состояния FPU или промежуточное округление в векторизованной среде, что может отклонить результаты от ссылки F77.
Вопрос:
Является ли логическое индексирование (показанное ниже) лучшим способом имитации поведения блока IF Фортрана с точки зрения точности и предотвращения предупреждений времени выполнения? Есть ли более «NumPy-tonic» способ добиться этого, более эффективный для больших 3D-сеток?
Из 168192 баллов я получаю только 4 предупреждения, что доказывает, что большая часть перезаписи
успеха.
python
mask_true = active & c1_3d
if np.any(mask_true):
l13[mask_true] = np.log(pup[mask_true] / pdwn[mask_true])
mask_false = active & (~c1_3d)
if np.any(mask_false):
l13[mask_false] = lnpu2p[k]
Подробнее здесь: https://stackoverflow.com/questions/798 ... arity-with
Отключение предупреждения NumPy о делении на ноль при сохранении побитовой четности с помощью F77 Double Precision ⇐ Python
Программы на Python
1770218077
Anonymous
Я переношу процедуру вертикальной интерполяции из Fortran 77 в NumPy. Я стремлюсь к побитовой четности (средняя абсолютная ошибка (\около 10^{-16})) с выводом gfortran, который использует ДВОЙНУЮ ТОЧНОСТЬ. В моей реализации NumPy я сталкиваюсь с предупреждением RuntimeWarning: деление на ноль, обнаруженным в журнале. Я понимаю, что это связано с тем, что np.where быстро оценивает обе ветви x и y, попадая в заполнители 0,0 или -9999,0 в моих «неактивных» ячейках сетки перед применением маски.
[b]Исходная логика F77[/b]
IF (ABS (PSFC (I, J) - PRES (K_IN)) .lt. 0.01) then
PMID = PRES (K_IN)
PUP = PRES (K_IN + 1)
SMID = SPRES (I, J, K_IN)
SUP = SPRES (I, J, K_IN + 1)
LNP1P2 = LNPU1P(K_IN)
LNP1P3 = LOG (PUP / PDWN)
LNP2P3 = LOG (PMID / PDWN)
[b]Моя текущая попытка NumPy (вызывает предупреждение):[/b]
l13[active] = np.where(c1_3d, np.log(pup/pdwn), lnpu2p[k])[active]
[b]Мое ограничение:[/b]
Я должен поддерживать (10^{-16}) MAE. Простое использование np.seterr(divide='ignore') неприемлемо. Я подозреваю, что вычисление журнала ненужных данных - даже если они отброшены - может незаметно повлиять на флаги состояния FPU или промежуточное округление в векторизованной среде, что может отклонить результаты от ссылки F77.
[b]Вопрос:[/b]
Является ли логическое индексирование (показанное ниже) лучшим способом имитации поведения блока IF Фортрана с точки зрения точности и предотвращения предупреждений времени выполнения? Есть ли более «NumPy-tonic» способ добиться этого, более эффективный для больших 3D-сеток?
Из 168192 баллов я получаю только 4 предупреждения, что доказывает, что большая часть перезаписи
успеха.
[b]python[/b]
mask_true = active & c1_3d
if np.any(mask_true):
l13[mask_true] = np.log(pup[mask_true] / pdwn[mask_true])
mask_false = active & (~c1_3d)
if np.any(mask_false):
l13[mask_false] = lnpu2p[k]
Подробнее здесь: [url]https://stackoverflow.com/questions/79880442/silencing-numpy-divide-by-zero-warning-while-maintaining-bit-for-bit-parity-with[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия