Python生成Contour Plot时触发ValueError:数组元素赋值序列问题的排查求助
问题分析与解决:生成Contour Plot时的ValueError
咱们先拆解一下你遇到的错误:ValueError: setting an array element with a sequence,这个错误的核心是维度不匹配。
你初始化的b是一个一维数组(shape=(3,)),但当你传入mv和nv(这两个是meshgrid生成的二维数组,shape=(1000,1000))时,(y[i]*y[j])*m*n计算得到的是一个二维数组,你试图把这个二维数组赋值给一维数组b的单个元素b[j],这显然行不通——单个位置只能放标量,不能放整个二维序列。
先做数学简化,从根源解决问题
其实你的公式可以先化简,避免不必要的循环,同时完美解决维度问题:
$$a_i(m,n)= \sum_j y_iy_jm*n = y_i \cdot m \cdot n \cdot \sum_j y_j$$
因为$y_i$、$m$、$n$都和求和变量$j$无关,可以直接提到求和符号外面。这样一来,我们根本不需要嵌套循环,就能直接生成每个$a_i$对应的二维数组。
修正后的代码
import numpy as np import matplotlib.pyplot as plt y = np.array([0.09, 0.09, 0.09]) sum_y = np.sum(y) # 先计算y的总和,只算一次就够了 def a(m, n): # 对每个y_i,生成对应的二维数组,返回一个形状为(3, 1000, 1000)的数组 return y[:, np.newaxis, np.newaxis] * sum_y * m * n m = np.linspace(0, 10, 1000) n = np.linspace(0, 10, 1000) mv, nv = np.meshgrid(m, n) # 调用函数得到三个a_i的二维数组 a_arrays = a(mv, nv) # 为每个a_i绘制Contour Plot for idx, ai in enumerate(a_arrays): plt.figure() contour = plt.contourf(mv, nv, ai) plt.colorbar(contour) plt.title(f'Contour Plot for a_{idx+1}(m,n)') plt.xlabel('m') plt.ylabel('n') plt.show()
代码解释
y[:, np.newaxis, np.newaxis]:把一维的y数组扩展成三维形状(3,1,1),这样和二维的mv*nv(形状(1000,1000))做乘法时,会自动广播成(3,1000,1000)的数组,每个维度对应一个$a_i$的二维数据。- 这样生成的
a_arrays里,每个元素都是适合绘制contour plot的二维网格数据,完全避免了原代码中的维度不匹配问题。
内容的提问来源于stack exchange,提问作者Arghyajit Datta
相关产品推荐
相关产品推荐

