Вывод чисел numpy с приведением к ним типов, что является ошибкой в ​​​​моей программе

Я привожу кортеж Python к массиву numpy, используя функцию кватерниона, а затем возвращаю возвращаемый массив numpy обратно в кортеж. Здесь start_pos — кортеж (0,0,0). Второй кортеж попадает в список.

current_pos = np.array(start_pos)
current_quaternion = Quaternion.from_axis_angle(np.array([0,0,1]), math.radians(rotation))
vertices.append(tuple(current_pos))

Раньше это работало на моем последнем ноутбуке, но теперь, когда я запускаю исходный код, вывод tuple(current_pos) выглядит как (np.int64(0), np.int64(0), np.int64(0))

У меня это не работает, потому что вершины нужно записывать в файл, а для формата нужны необработанные числа, например 0.4999238475781956, а не np.float64(0.4999238475781956).

Раньше тот же исходный код выдавал правильную вещь после tuple(current_pos). Он выводит необработанные числа. Когда я импортировал свои файлы в новый ноутбук и установил Python и numpy, что-то изменилось, что вызвало эту проблему.

  • Версия Python: 3.12.4 (tags/v3.12.4:8e8a4ba, 6 июня 2024 г., 19:30:16) [MSC v.1940 64 бит (AMD64)]
  • Версия NumPy: 2.0.1.

с start_pos = (0,0,0) я ожидал, что кортеж из трех необработанных чисел в виде чисел с плавающей запятой будет добавлен в список vertices. Вместо этого vertices выглядит так:

[(np.int64(0), np.int64(0), np.int64(0)),
 (np.float64(0.0), np.float64(0.0), np.float64(1.0)),
 (np.float64(0.4999238475781956), np.float64(0.008726203218641754), np.float64(1.8660254037844388)),
 (np.float64(0.0), np.float64(0.0), np.float64(2.0))]

Не могли бы вы указать, из какого пакета вы импортируете Quaternion? (Я попробовал как минимум две реализации, но ни одна из них не .from_axis_angle)

jsbueno 30.07.2024 21:55

Кроме того, если вы можете вставить фрагмент того, как вы записываете эти числа, в нужный файл - я чувствую, что настройка на этом этапе может решить проблему для вас. Я только что проверил. Скаляры Numpy во многих отношениях совместимы и взаимозаменяемы с числами. Это просто их представление по умолчанию в виде строк, которые изменились для numpy 2.0.

jsbueno 30.07.2024 22:03

Какое отношение функция кватерниона имеет к проблеме? В этом фрагменте результат не используется и даже не принимает current_pos в качестве параметра.

wjandrea 30.07.2024 22:06

Вы рассматривали возможность использования .tolist()? Он возвращает скаляры Python вместо скаляров NumPy. Кроме того, чтобы внести ясность, вы всегда получали скаляры NumPy, раньше они просто выглядели как скаляры Python.

wjandrea 30.07.2024 22:14

Как вы записываете эти кортежи в файл?

hpaulj 30.07.2024 22:15
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
6
59
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

import numpy as np
import math
from some_quaternion_library import Quaternion  

vertices = []
start_pos = (0, 0, 0)
rotation = 30  

current_pos = np.array(start_pos)
current_quaternion = Quaternion.from_axis_angle(np.array([0, 0, 1]), math.radians(rotation))

# Convert NumPy array elements to native Python types
def convert_to_native_types(array):
    return tuple(array.astype(float) if array.dtype.kind == 'f' else array.astype(int))

vertices.append(convert_to_native_types(current_pos))

quaternion_array = current_quaternion.to_numpy()  
vertices.append(convert_to_native_types(quaternion_array))

print(vertices)

Хотя этот код может решить проблему, добавление описания того, как это поможет, очень поможет. Вы можете редактировать . Советы и другие подсказки см. в разделе Как ответить.

wjandrea 30.07.2024 22:18

Почему бы просто не использовать .tolist() для преобразования в собственные типы Python?

wjandrea 30.07.2024 22:19
Ответ принят как подходящий

Я предполагаю, что разница в том, что вы изначально использовали Numpy 1.2x и обновились до numpy 2.0. Согласно примечаниям к выпуску, в настоящее время изменилось представление плавающих объектов. В примечаниях к выпуску упоминается, что это может быть проблемой при выводе в файл. Вы не показываете, как печатаете в файл, и не объясняете, почему вы используете кортежи, а не двумерный массив, поэтому мои предложения будут ограничены.

Если вы хотите сохранить текущий код, преобразуйте массив numpy в список чисел с плавающей запятой Python при создании кортежа.

vertices.append(tuple(current_pos.tolist()))

Или вы можете понизить версию numpy до 1.2x или сделать то, что сказано в документации для использования устаревшего представления, то есть добавить np.set_printoptions(legacy = "1.25") после импорта.

Может просто tuple(current_pos.tolist())

juanpa.arrivillaga 30.07.2024 22:08

@juanpa.arrivillaga Хорошая мысль, я слишком усложнил задачу. Спасибо за предложение.

jared 30.07.2024 22:09

Большое спасибо, это дает мне множество способов это исправить. Я усвоил важный урок о проверке примечаний к выпуску.

Gregory Driscoll 30.07.2024 22:52

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