绘制二元函数时循环计算输出形状错误的问题排查
问题分析:等高线图Z值计算循环错误导致的Shape异常
你编写的Z_values函数在计算Z矩阵时存在逻辑错误,导致最终返回的矩阵所有行都是空列表,触发TypeError。
原代码问题点
核心循环逻辑的问题出在这里:
def Z_values(X,Y,f): matrix=[] columns=[] for x in X: for y in Y: a=f(x,y) columns.append(a) matrix.append(columns) columns.clear() return matrix
因为列表是引用类型,matrix.append(columns)只是把columns的引用添加到了matrix中,后续调用columns.clear()会直接清空这个列表的内容——包括已经存在于matrix里的那一行数据。循环结束后,matrix里的所有元素都是指向同一个空列表的引用,最终Z矩阵的形状变成(len(X), 0),不符合plt.contour要求的至少(2,2)的输入规格。
修复方案
每次遍历x时新建一个columns列表,避免复用同一个列表对象:
def Z_values(X,Y,f): matrix=[] for x in X: columns=[] # 每次循环x时重新创建列表 for y in Y: a=f(x,y) columns.append(a) matrix.append(columns) return matrix
也可以用更简洁的列表推导式实现:
def Z_values(X,Y,f): return [[f(x,y) for y in Y] for x in X]
修改后,matrix中的每一行都是独立的列表,不会被后续操作清空,生成的Z矩阵形状为(len(X), len(Y)),完全符合plt.contour的输入要求。
内容的提问来源于stack exchange,提问作者Von
相关产品推荐
相关产品推荐

