Python中元组按不同比例缩放求线性组合输出异常问题排查
问题原因
Python 中元组的 += 操作是拼接元组而非逐元素算术加法:
- 初始化的
x = 0, 0是长度为2的元组 - 每次循环执行
x += (i * e[0], i * e[1])时,会把新生成的2元素元组直接追加到原元组末尾 - 3次循环共追加6个元素,加上初始的2个元素,最终得到长度为8的元组,和你实际运行的输出完全吻合。
解决方法
可选以下两种方案修改:
方案1:最小改动原代码,将x改为列表做逐元素累加
import numpy as np w_list = np.zeros(3) sum_val = 0 for i in range(3): w_list[i] = np.random.random_sample() sum_val += w_list[i] w = w_list/sum_val # 缩放权重 corners = [(0, 0), (1, 0), (0.5, np.sqrt(3/4))] x = [0.0, 0.0] for i, e in zip(w, corners): x[0] += i * e[0] x[1] += i * e[1] # 如果需要元组格式输出,可以加 x = tuple(x)
注意:原代码中用
sum做变量名会覆盖Python内置的sum()函数,建议修改为其他名称。
方案2:用numpy向量运算简化代码
import numpy as np # 生成归一化权重 w = np.random.rand(3) w /= w.sum() # 定义等边三角形顶点数组 corners = np.array([(0, 0), (1, 0), (0.5, np.sqrt(3/4))]) # 直接计算线性组合 x = (w[:, np.newaxis] * corners).sum(axis=0)
内容的提问来源于stack exchange,提问作者N.A.
相关产品推荐
相关产品推荐

