如何从pyarrow整数类型数组中按索引提取原生Python整数值
问题解决与原理说明
直接解决方案
你调用as_py未得到预期整数的核心原因是漏写了方法调用的括号:as_py是Int64Scalar的实例方法而非属性,正确写法为:
x[0].as_py()
执行后即可得到原生Python int类型的数值1。
相关现象的底层逻辑
- pyarrow数组按索引取值默认返回对应类型的
Scalar包装对象,而非直接返回Python原生类型,这是pyarrow为了避免频繁内存拷贝、维持向量化计算性能做的设计,所有类型的数组索引取值都会先返回Scalar对象。 - 字符串类型的Scalar对象可以用
str(y[0])直接得到原生字符串,是因为pyarrow对字符串Scalar的__str__魔术方法做了专门实现,直接返回内部存储的原生字符串值;而数值类Scalar没有对__int__/__float__之外的转换逻辑做特殊适配,虽然直接用int(x[0])也能得到结果,但更通用规范的写法是调用所有类型Scalar都支持的as_py()方法做类型转换。 - 如果你需要一次性获取全量原生类型数据,可以直接调用数组的
to_pylist()方法,示例:x.to_pylist()会直接返回由原生int组成的列表[1,2,3],单元素取值也可写为x.to_pylist()[0],但仅取单个元素时x[0].as_py()的性能更高。
内容的提问来源于stack exchange,提问作者AJW
相关产品推荐
相关产品推荐

