为何修改Numpy数组指定列数据类型后替换原列仍未生效?
为什么修改Numpy数组指定列的数据类型后,原列类型没变化?
这是个很典型的numpy新手坑——普通numpy数组是「同质」的,整个数组里的所有元素必须共享同一个数据类型。你一开始创建数组时,因为列表里混合了浮点数、整数和字符串,numpy自动把整个数组的 dtype 统一成了<U32(字符串类型)。
当你执行array[:,0]=array[:,0].astype("float64")时,虽然你把第0列转成了float64,但赋值回原数组的瞬间,numpy会自动把这些float64值再转成字符串类型存回去——因为原数组的整体 dtype 还是<U32,根本容不下其他类型的数据。所以你查看 dtype 时,自然还是原来的字符串类型。
解决方法
想要实现不同列用不同数据类型,你需要使用numpy的结构化数组(Structured Array),它支持每一列设置独立的 dtype:
方法1:创建数组时直接指定各列类型
import numpy as np arraylist =[(1526869384.273246, 0, 'a0'), (1526869385.273246, 1, 'a1'), (1526869386.273246, 2, 'a2'), (1526869387.273246, 3, 'a3'), (1526869388.273246, 4, 'a4'), (1526869389.273246, 5, 'a5'), (1526869390.273246, 6, 'a6'), (1526869391.273246, 7, 'a7'), (1526869392.273246, 8, 'a8'), (1526869393.273246, 9, 'a9'), (1526869384.273246, 0, 'a0'), (1526869385.273246, 1, 'a1'), (1526869386.273246, 2, 'a2'), (1526869387.273246, 3, 'a3'), (1526869388.273246, 4, 'a4'), (1526869389.273246, 5, 'a5'), (1526869390.273246, 6, 'a6'), (1526869391.273246, 7, 'a7'), (1526869392.273246, 8, 'a8'), (1526869393.273246, 9, 'a9')] # 定义每列的名称和对应数据类型 dtype_spec = [('timestamp', 'float64'), ('index', 'int32'), ('label', 'U2')] structured_array = np.array(arraylist, dtype=dtype_spec) # 查看第0列(timestamp)的类型 print(structured_array['timestamp'].dtype) # 输出: dtype('float64')
方法2:将现有同质数组转换为结构化数组
如果已经有了之前创建的<U32类型数组,可以通过列表推导式转换:
# 原同质数组 array = np.array(arraylist) # 转换为结构化数组 structured_array = np.array( [(float(row[0]), int(row[1]), row[2]) for row in array], dtype=[('timestamp', 'float64'), ('index', 'int32'), ('label', 'U2')] )
方法3:用Pandas(更便捷的多类型列处理)
如果你的场景允许使用Pandas,它天生支持不同列用不同数据类型,操作更直观:
import pandas as pd df = pd.DataFrame(arraylist, columns=['timestamp', 'index', 'label']) df['timestamp'] = df['timestamp'].astype('float64') print(df['timestamp'].dtype) # 输出: float64
关键总结
普通numpy数组是「同质」的,所有元素必须同类型;只有结构化数组(或Pandas的DataFrame)能实现「异质」列,每列独立设置数据类型。你之前的操作因为原数组是字符串类型,赋值时会自动转换回字符串,所以看起来类型没变化。
内容的提问来源于stack exchange,提问作者nooper
相关产品推荐
相关产品推荐

