У меня большая библиотека со множеством докторов. Все тесты проходят на моем компьютере. Когда я отправляю изменения в 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, поэтому не знаю, почему так происходит. Кроме того, поскольку тесты проходят на моем компьютере, я не знаю, как отладить ошибку, и мне сложно создать минимальный рабочий пример. Есть ли способ снова пройти тесты, не меняя каждый отдельный тест?
Пожалуйста, предоставьте пример кода. Для справки см. минимальный воспроизводимый пример.
@wjandrea в моем файле требований написано numpy>=1.21.3. Код выполняется на действиях GitHub, поэтому я не уверен, какую именно версию они используют.
Это связано с изменением numpy 2: numpy.org/devdocs/release/…. Вероятно, вам следует ограничить numpy в файле требований значением <2.
@juanpa.arrivillaga в numpy 2 есть много других критических изменений. Вам следует либо изменить его на >= 2.0.0, либо ограничить до 1.x.x.
Показать один или несколько проблемных документов
Вы делали что-то вроде list(np.array([13.0, 12.0, 7.0]))?
@Догберт, спасибо большое! Я изменил строку в файле require.txt на numpy>=1.21.3,<2.0.0 и проблема решена!
@Erel Вы можете составить MRE постфактум благодаря информации, предоставленной Догбертом. Скажите, например: «Когда я проверяю журналы в GitHub Actions, они используют NumPy 2.[x].[y]» и используйте предоставленный код hpaulj. Примечание: если вы действительно используете list(np.ndarray), вам, вероятно, следует вместо этого использовать np.ndarray.tolist(), который использует скаляры Python вместо скаляров NumPy.
Более того, для деталей отладки требуется тег [numpy 2.0]. Я бы открыл это снова, если бы не репутация доводчиков.
Связанный: Как распечатать список значений numpy.float32? и Изменилось строковое представление объектов numpy?






Это связано с изменением способа печати скаляров в 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 pypi.org/project/numpy сообщает, что 16 июня была выпущена версия 2.0.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
Какую версию (версии) NumPy вы используете? Я предполагаю, что это более актуально, чем версия Python.