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

使用numpy的astype(int)得到np.int64而非int,该如何解决?

如何将numpy.int32数组元素转为Python原生int(适配cppyy的std::vector索引)

问题背景

现有一个np.int32类型的numpy数组:

idx = array([ 607,  638,  639, ..., 9279, 9317, 9318], dtype=int32)

验证元素类型确认是numpy标量:

>>> type(idx[0])
<class 'numpy.int32'>

由于cppyy对std::vector<T>的索引类型要求严格,直接用numpy.int32元素索引会报错:

>>> v[idx[0]]
*** TypeError: an integer is required

只有转为Python原生int才能正常索引:

>>> v[int(idx[0])]
<cppyy.gbl.std.vector<double> object at 0x559a9a8845a8>

尝试用idx.astype(int)转换,但得到的是np.int64类型元素,仍不符合需求:

>>> idx2 = idx.astype(int)
>>> type(idx2[0])
<class 'numpy.int64'>

解决方案

1. 最简洁的方式:调用tolist()

numpy数组的tolist()方法会自动将所有numpy标量转为Python原生类型,直接得到元素为原生int的列表:

idx5 = idx.tolist()
>>> type(idx5[0])
<class 'int'>

该方法无需手动循环,代码简洁且完全满足cppyy的索引要求。

2. 可靠的列表推导式(已验证可行)

你当前使用的列表推导式是直接且可靠的方案,逐个将numpy标量转为原生int:

idx3 = [int(k) for k in idx]
>>> type(idx3[0])
<class 'int'>

3. 可选:用np.vectorize批量转换

利用np.vectorize将int函数向量化,批量转换后转为列表:

to_py_int = np.vectorize(int)
idx4 = to_py_int(idx).tolist()
>>> type(idx4[0])
<class 'int'>

注意:np.vectorize本质是循环封装,性能和列表推导式相近,必须调用tolist()才能得到原生int元素。

关键说明

idx.astype(int)无法满足需求的原因是:numpy中的int类型在64位系统下默认映射为np.int64,转换后仍然是numpy标量,而非Python原生int,因此无法通过cppyy的类型检查。

内容的提问来源于stack exchange,提问作者Urban

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 13:42:34