为何astype(int)无法修改NumPy数组的数据类型?
问题原因与解决方案
核心原因
NumPy数组是同质数据结构,整个数组的dtype是统一设定的,无法单独修改某一个切片的类型。当你把int类型的值赋值给float类型的数组切片时,NumPy会自动将int转换为数组原本的float类型后再存储,所以你看到的切片依然是浮点型,赋值操作并没有改变数组的整体类型。
解决方案
根据你的需求,有几种处理方式:
1. 将整个数组转换为整型
如果数组中所有元素都适合转为整型,直接修改整个数组的dtype即可:
import numpy as np # 针对你的示例代码 a = np.zeros((2, 3, 4)) a = a.astype(int) print(a[:, :, 3]) # 输出:[[0 0 0] # [0 0 0]] print(a.dtype) # 输出:int64
2. 保留原数组浮点型,单独存储目标列的整型数据
如果原数组其他部分需要保留浮点类型,你可以新建一个独立的整型数组来存储目标列的数据:
import numpy as np a = np.zeros((2, 3, 4)) # 提取目标列并转为整型存储 target_col = a[:, :, 3].astype(int) print(target_col) # 输出:[[0 0 0] # [0 0 0]] print(target_col.dtype) # 输出:int64
3. 使用结构化数组(混合类型)
如果确实需要在同一个数组容器中存储不同类型的数据,可以使用NumPy的结构化数组:
import numpy as np # 定义结构化数据类型:前3列是float,第4列是int dtype = [('col0', 'f8'), ('col1', 'f8'), ('col2', 'f8'), ('col3', 'i8')] # 创建结构化数组 a = np.zeros((2, 3), dtype=dtype) # 赋值第4列(col3) a['col3'] = 0 print(a['col3']) # 输出:[[0 0 0] # [0 0 0]] print(a['col3'].dtype) # 输出:int64
针对你原始代码的修改
如果你只想让目标列的数值表现为整型(不需要修改整个数组类型),可以在需要使用的时候再转换;如果允许修改整个数组类型,直接转换后处理即可:
import numpy as np # 原始代码修改:先将整个数组转为int timeseries_resampled = timeseries_resampled.astype(int) # 统一处理目标列的取整操作 timeseries_resampled[:, :, 9] = np.rint(timeseries_resampled[:, :, 9]) print(timeseries_resampled[:, :, 9].dtype) # 输出:int64
内容的提问来源于stack exchange,提问作者Unistack
相关产品推荐
相关产品推荐

