调用np.log10处理函数生成列表元素时触发TypeError报错
报错根因
代码里有两处写法错误,直接触发了类型报错:
dlArr定义错误:你写的(dl(z,rz) for z, rz in zip(zArr, rzArr))用圆括号包裹推导式,得到的是惰性求值的生成器对象,不是实际计算完成的数值序列;你还在生成器外套了一层方括号,最终dlArr是一个仅包含1个生成器元素的列表,根本没有存任何计算好的距离值。- 遍历逻辑错误:构造
mthArr时你给dlArr套了无意义的zip(),最终传入mth函数的dlv参数是前面的生成器对象,numpy的np.log10是针对数值类型的通用函数,无法处理没有对应计算方法的生成器,直接抛出类型错误。
报错原文:
TypeError: loop of ufunc does not support argument 0 of type generator which has no callable log10 method
修复方案
直接修正两处错误即可,优先用numpy向量化计算,比Python层循环效率高很多:
import numpy as np # 注:zArr、rzArr为你预先定义的红移、距离原始序列 def dl(z, rz): return (1 + z) * rz # 修正1:不要存生成器,直接计算得到数值数组 # 如果zArr、rzArr是普通列表,用下面这行 dlArr = np.array([dl(z, rz) for z, rz in zip(zArr, rzArr)]) # 如果zArr、rzArr本身就是numpy数组,直接用广播计算,不用写循环,速度更快 # dlArr = (1 + zArr) * rzArr def mth(dlv): return 5 * np.log10(dlv) + 24 # 修正2:去掉无意义的zip和多余的列表推导,numpy支持直接对数组做批量计算 mthArr = mth(dlArr)
注意事项
- 推导式用方括号
[]包裹才会立刻执行得到列表,用圆括号()包裹得到的是惰性生成器,不会立刻计算值,numpy数值计算函数无法直接处理生成器,需要先转成列表或numpy数组。 zip()仅用于将多个等长可迭代对象按位置打包为元组序列,不要给单个可迭代对象随便套zip(),否则只会得到单元素元组序列,拿不到你需要的原始数值。- numpy原生支持批量向量化计算,只要传入的是同类型数值数组,不需要写循环逐元素调用函数,代码更简洁、运行速度更快。
内容的提问来源于stack exchange,提问作者cosmo123
相关产品推荐
相关产品推荐

