使用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
相关产品推荐
相关产品推荐

