Numpy astype为二维数组列指定dtype时出现向上转型问题
给Numpy二维数组的每列设置特定dtype的正确方法
嘿,我完全懂你遇到的困惑——本来想给二维数组的每一列分别指定不同的dtype,结果用astype之后不仅没达到预期,反而出现了向上转型,还多出来奇怪的轴结构对吧?
为什么你的方法会出错
你用的astype方法,当传入结构化dtype时,Numpy的处理逻辑是把原数组中的每个元素映射到结构化类型的每个字段上,而不是按列去匹配字段。举个例子,你的原数组是(5,5)的整数数组,当你传入有5个字段的dtype时,Numpy会把每个整数转换成一个包含5个字段的结构体,最终得到的是一个(5,5)的数组,每个位置都是一个带5个字段的元组——这就是你看到的“向上转型”和数组复制的原因,完全不是按列分配类型的逻辑。
正确的实现方式
要给每列指定不同的dtype,你需要把每一列单独拿出来,再组合成一个结构化数组,这里推荐用np.rec.fromarrays函数,它专门做这件事:
import numpy as np # 你的原始数组 a = np.arange(25).reshape((5,5)) # 按列拆分并组合成结构化数组 structured_array = np.rec.fromarrays( [a[:, 0], a[:, 1], a[:, 2], a[:, 3], a[:, 4]], dtype=[('width', '<i4'), ('height', '<i4'), ('depth', '<i4'), ('score', '<f4'), ('auc', '<f4')] )
验证结果
现在查看这个结构化数组的结构:
print(structured_array.shape) # 输出: (5,) print(structured_array[0]) # 输出: (0, 1, 2, 3., 4.) print(structured_array.dtype) # 输出: dtype([('width', '<i4'), ('height', '<i4'), ('depth', '<i4'), ('score', '<f4'), ('auc', '<f4')])
可以看到,现在数组是一维的,每个元素对应原数组的一行,每个字段对应原数组的一列,并且每个字段都应用了你指定的dtype——比如score和auc已经变成了浮点型,其他列保持整数型。
额外说明
如果你需要保持类似二维数组的访问方式(比如按列取数),结构化数组也支持:
# 取出所有行的width列(原数组第一列) print(structured_array['width']) # 输出: [ 0 5 10 15 20] # 取出第二行的score字段 print(structured_array[1]['score']) # 输出: 8.0
内容的提问来源于stack exchange,提问作者Dan Stowell
相关产品推荐
相关产品推荐

