如何将numpy数组中子列表的第二个元素除以第一个元素?
问题描述
我有一个变量var,在Jupyter中直接打印输出如下:
var # array([list([9166855000000.0, 13353516.0]), # list([7818836000000.0, 11389833.0]), # list([20269756000000.0, 29527304.0]), # list([66886956000000.0, 97435384.0]), # list([58686560000000.0, 85489730.0]), # list([50809440000000.0, 74014984.0])], dtype=object)
使用print(var)时输出:
print(var) # [list([9166855000000.0, 13353516.0]) # list([7818836000000.0, 11389833.0]) # list([20269756000000.0, 29527304.0]) # list([66886956000000.0, 97435384.0]) # list([58686560000000.0, 85489730.0]) # list([50809440000000.0, 74014984.0])]
该变量类型为:
print(type(var)) # <class 'numpy.ndarray'>
需要将每个子列表的第二个元素除以第一个元素,得到类似以下形式的数组或列表:
13353516.0/9166855000000.0 ... 74014984.0/50809440000000.0
解决方案
方法1:转换为数值型numpy数组后做向量化运算
当前数组是dtype=object类型,内部元素为Python列表,先将其转换为二维数值型数组,再直接执行列除法:
import numpy as np # 转换为二维float数组 arr = np.array(var.tolist(), dtype=np.float64) # 第二个元素列除以第一个元素列 result = arr[:, 1] / arr[:, 0]
执行后result即为目标numpy数组,直接打印可得到所有除法结果。
方法2:列表推导式生成Python列表
如果需要Python列表格式,直接遍历原数组计算:
result = [item[1] / item[0] for item in var]
该方法无需额外数组转换,逻辑直观简洁。
方法3:numpy vectorize函数(仅作参考,不推荐大数据量场景)
用np.vectorize包装除法逻辑,对每个元素逐个处理:
divide_func = np.vectorize(lambda x: x[1]/x[0]) result = divide_func(var)
注意:vectorize本质是循环实现,性能不如向量化运算,数据量大时优先选择方法1。
内容的提问来源于stack exchange,提问作者len
相关产品推荐
相关产品推荐

