Как остановить отображение чисел с плавающей запятой как «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, поэтому не знаю, почему так происходит. Кроме того, поскольку тесты проходят на моем компьютере, я не знаю, как отладить ошибку, и мне сложно создать минимальный рабочий пример. Есть ли способ снова пройти тесты, не меняя каждый отдельный тест?

Какую версию (версии) NumPy вы используете? Я предполагаю, что это более актуально, чем версия Python.

wjandrea 16.06.2024 21:26

Пожалуйста, предоставьте пример кода. Для справки см. минимальный воспроизводимый пример.

wjandrea 16.06.2024 21:26

@wjandrea в моем файле требований написано numpy>=1.21.3. Код выполняется на действиях GitHub, поэтому я не уверен, какую именно версию они используют.

Erel Segal-Halevi 16.06.2024 21:43

Это связано с изменением numpy 2: numpy.org/devdocs/release/…. Вероятно, вам следует ограничить numpy в файле требований значением <2.

Dogbert 16.06.2024 21:55

@juanpa.arrivillaga в numpy 2 есть много других критических изменений. Вам следует либо изменить его на >= 2.0.0, либо ограничить до 1.x.x.

Dogbert 16.06.2024 22:15

Показать один или несколько проблемных документов

hpaulj 17.06.2024 03:42

Вы делали что-то вроде list(np.array([13.0, 12.0, 7.0]))?

hpaulj 17.06.2024 04:35

@Догберт, спасибо большое! Я изменил строку в файле require.txt на numpy>=1.21.3,<2.0.0 и проблема решена!

Erel Segal-Halevi 17.06.2024 10:38

@Erel Вы можете составить MRE постфактум благодаря информации, предоставленной Догбертом. Скажите, например: «Когда я проверяю журналы в GitHub Actions, они используют NumPy 2.[x].[y]» и используйте предоставленный код hpaulj. Примечание: если вы действительно используете list(np.ndarray), вам, вероятно, следует вместо этого использовать np.ndarray.tolist(), который использует скаляры Python вместо скаляров NumPy.

wjandrea 17.06.2024 16:09

Более того, для деталей отладки требуется тег [numpy 2.0]. Я бы открыл это снова, если бы не репутация доводчиков.

hpaulj 17.06.2024 17:22
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
11
419
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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.0 еще не выпущен? Я не очень хорошо знаком с файлом require.txt, но почему pip вообще устанавливает предварительную версию?

wjandrea 17.06.2024 21:37

@wjandrea pypi.org/project/numpy сообщает, что 16 июня была выпущена версия 2.0.0.

Dogbert 17.06.2024 22:16

Ой! Документация еще не была обновлена, когда я просматривал ее сегодня.

wjandrea 17.06.2024 22:23

Это связано с 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

Другие вопросы по теме