You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

创建NumPy数组时如何保留自定义dtype?

解决NumPy自动转换(2,)u8 dtype的问题

当你使用np.dtype("(2,)u8")时,NumPy会将(2,)解析为数组的维度而非单个元素的结构,因此会生成形状为(4,2)、dtype为uint64的二维数组。要创建每个元素是两个uint64(u8)元组的一维数组,可以用以下两种方法:

方法1:直接使用结构化dtype创建

定义结构化数据类型,明确每个元素包含两个uint64字段,这样NumPy不会自动展开维度:

import numpy as np

# 定义包含两个匿名uint64字段的dtype
dt = np.dtype("u8, u8")
a = np.empty(4, dtype=dt)

print(a.shape, a.dtype)
# 输出:(4,) [('f0', '<u8'), ('f1', '<u8')]

此时数组形状为(4,),每个元素是包含两个uint64值的元组,例如a[0]会返回类似(0, 0)的结果。

方法2:从已有的二维数组修改dtype

如果已经生成了二维数组,可以通过view()方法将其转换为结构化dtype,该操作共享内存,无需复制数据:

import numpy as np

# 先创建二维数组
a = np.empty((4, 2), dtype="u8")
# 将每一行视为一个结构化元素
a = a.view("u8, u8")

print(a.shape, a.dtype)
# 输出:(4,) [('f0', '<u8'), ('f1', '<u8')]

补充说明

如果你的实际需求是每个元素包含两个uint8(而非uint64),只需将上述代码中的u8替换为u1即可,对应NumPy的uint8类型。

内容的提问来源于stack exchange,提问作者Nico Schlömer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 04:45:02