Как остановить отображение чисел с плавающей запятой как «np.float64»?

У меня большая библиотека со множеством докторов. Все тесты проходят на моем компьютере. Когда я отправляю изменения в GitHub, GitHub Actions запускает те же тесты в Python 3.8, 3.9, 3.10 и 3.11. Все тесты выполняются корректно на на Python 3.8; однако в Python 3.9, 3.10 и 3.11 я получаю много ошибок следующего типа:

Expected:
    [13.0, 12.0, 7.0]
Got:
    [np.float64(13.0), np.float64(12.0), np.float64(7.0)]

То есть результаты правильные, но почему-то отображаются внутри «np.float64».

В своем коде я вообще не использую np.float64, поэтому не знаю, почему так происходит. Кроме того, поскольку тесты проходят на моем компьютере, я не знаю, как отладить ошибку, и мне сложно создать минимальный рабочий пример. Есть ли способ снова пройти тесты, не меняя каждый отдельный тест?

🤔 А знаете ли вы, что...
Python имеет множество фреймворков для веб-разработки, такие как Django и Flask.


419
3

Ответы:

Решено

Это связано с изменением способа печати скаляров в numpy 2:

число 1.х.х:

>>> repr(np.array([1.0])[0])
'1.0'

число 2.х.х:

>>> repr(np.array([1.0])[0])
'np.float64(1.0)'

Вам следует ограничить версию numpy до 1.x.x в вашем файле требований, чтобы убедиться, что вы не установите numpy 2.x.x:

numpy ~> 1.26

(то же, что numpy >= 1.26, == 1.*, см. этот ответ)

или обновите свой код для работы с numpy 2 и измените его на numpy ~> 2.0.


Это связано с numpy 2, как упомянул @Dogbert. Вы можете указать формат печати, чтобы избавиться от np.float64:

array = [np.float64(13.0), np.float64(12.0), np.float64(7.0)]
str_array = [f"{x:.2f}" for x in array]
print(f"[{', '.join(str_array)}]")

numpy позволяет вам контролировать это без понижения версии:

np.set_printoptions(legacy='1.25')

Подробности см. в numpy.set_printoptions.

Об этом также говорится здесь: Изменено представление скаляров NumPy - Примечания к выпуску NumPy 2.0.0