Я привожу кортеж 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, что-то изменилось, что вызвало эту проблему.
с 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))]
Кроме того, если вы можете вставить фрагмент того, как вы записываете эти числа, в нужный файл - я чувствую, что настройка на этом этапе может решить проблему для вас. Я только что проверил. Скаляры Numpy во многих отношениях совместимы и взаимозаменяемы с числами. Это просто их представление по умолчанию в виде строк, которые изменились для numpy 2.0.
Это ответ на ваш вопрос? Как запретить отображение чисел с плавающей запятой как «np.float64»? , Как распечатать список значений numpy.float32?
Какое отношение функция кватерниона имеет к проблеме? В этом фрагменте результат не используется и даже не принимает current_pos
в качестве параметра.
Вы рассматривали возможность использования .tolist()? Он возвращает скаляры Python вместо скаляров NumPy. Кроме того, чтобы внести ясность, вы всегда получали скаляры NumPy, раньше они просто выглядели как скаляры Python.
Как вы записываете эти кортежи в файл?
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)
Хотя этот код может решить проблему, добавление описания того, как это поможет, очень поможет. Вы можете редактировать . Советы и другие подсказки см. в разделе Как ответить.
Почему бы просто не использовать .tolist() для преобразования в собственные типы Python?
Я предполагаю, что разница в том, что вы изначально использовали 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 Хорошая мысль, я слишком усложнил задачу. Спасибо за предложение.
Большое спасибо, это дает мне множество способов это исправить. Я усвоил важный урок о проверке примечаний к выпуску.
Не могли бы вы указать, из какого пакета вы импортируете
Quaternion
? (Я попробовал как минимум две реализации, но ни одна из них не.from_axis_angle
)