我使用四元数函数将 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,2024 年 6 月 6 日,19:30:16) [MSC v.1940 64 位 (AMD64)]
- NumPy 版本:2.0.1
和
start_pos = (0,0,0)
,我期望将 3 个原始数字的元组作为浮点数附加到列表中
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 数组维护数据类型,因此会在元组中看到类型转换。当创建
current_pos = np.array(start_pos)
时,它会创建一个数据类型为
int64
的 NumPy 数组,因为
start_pos
是一个整数元组。后续操作可能会将数组中的值更改为浮点数,但数组的数据类型仍为
int64
或
float64
。
要解决此问题,需要在创建元组后从 NumPy 数组中提取原始数字值。可以通过多种方式实现:
-
使用
tolist()
方法:
vertices.append(tuple(current_pos.tolist()))
tolist()
方法将 NumPy 数组转换为 Python 列表,其中包含原始 Python 数值类型。
- 使用列表推导:
vertices.append(tuple(float(x) for x in current_pos))
此方法遍历 NumPy 数组并使用
float(x)
将每个元素转换为 Python 浮点数,然后创建一个新的元组。
- 在创建数组时指定数据类型:
current_pos = np.array(start_pos, dtype=float)
vertices.append(tuple(current_pos))
通过在创建
current_pos
数组时指定
dtype=float
,可以确保数组从一开始就包含浮点数,从而无需以后进行转换。
通过应用这些方法中的任何一种,应该能够在
vertices
列表中获取原始数字元组,而不会出现类型转换。