为何numpy向量归一化时出现float与generator除法错误?
错误原因与修复方案
核心错误原因
触发TypeError的根本原因是**np.amax()无法直接接收生成器作为输入**。
看这段代码:
m = np.amax(np.sqrt(vx**2 + vy**2) for vx, vy in tempdata.values())
你传入的是一个生成器表达式(np.sqrt(...) for ...),但np.amax()的参数要求是数组、列表这类numpy可识别的类数组结构,生成器不在此范围内。这导致m并没有被赋值为你期望的最大向量长度,而是变成了一个生成器对象。后续执行value/m时,value是numpy数组(元素为float类型),而m是生成器,自然会触发“float和generator不能做除法”的错误。
修复方法
把生成器转换成numpy数组或者列表,让np.amax()能正确计算最大值:
方案1:转为numpy数组
# 先将生成器结果转为numpy数组 vector_lengths = np.array([np.sqrt(vx**2 + vy**2) for vx, vy in tempdata.values()]) m = np.amax(vector_lengths)
方案2:转为列表
vector_lengths = [np.sqrt(vx**2 + vy**2) for vx, vy in tempdata.values()] m = np.amax(vector_lengths)
额外潜在问题修复
代码末尾的x, y = tempdata.keys()和u, v = tempdata.values()也会报错——字典的keys()和values()是可迭代对象,无法直接解包成两个变量(除非字典只有一个键值对)。如果walk包含多个坐标对,需改成如下形式提取数据:
x = [coord[0] for coord in tempdata.keys()] y = [coord[1] for coord in tempdata.keys()] u = [vec[0] for vec in tempdata.values()] v = [vec[1] for vec in tempdata.values()]
内容的提问来源于stack exchange,提问作者gournge
相关产品推荐
相关产品推荐

