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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 08:35:06