首页 > 解决方案 > 如何用两个 2D 数组 (x,y) 和 0D 数组即标量 (z) 绘制等高线图?

问题描述

我正在尝试使用两个二维数组绘制等高线图(两者的形状 (6,1) 作为 x 和 y,我的第三个数据 (z) 是 x 向量之间的计算 RMS(x 列表只有 6 个项目)和 y 向量(y 列表有 600 项)。RMS 值是每个点的标量。我的意思是每个点都有一个 RMS 值。当我尝试使用 x、y、z 绘制等高线图时,会出现以下错误:

TypeError:输入 z 必须是二维数组

如何解决这个问题呢?

提前致谢

import numpy
import matplotlib.pyplot as plt
from math import sqrt

def Cumulative_Sensitivity (depth, coil_spacing, coil_position):
    global z
    global s
    z=numpy.array(depth)
    s=numpy.array(coil_spacing)
    if coil_position == "hcp":
        cs=(4*(z/s)**2+1)**(-0.5)
        cs=numpy.array(cs)
    elif coil_position == "vcp":
        cs=(4*(z/s)**2+1) **(0.5)-2*(z/s)
        cs=numpy.array(cs)
    return cs

def forward_model (sigma, depth, coil_spacing, coil_position):
    global cs
    global cond_true
    global cond_apps
    cond_true=numpy.array(sigma)
    cond_apps=numpy.zeros(len(coil_spacing)) 
    for i in range (0, len(coil_spacing)):    
        cs= Cumulative_Sensitivity (depth, coil_spacing[i], coil_position)
        cond_app = sum(cond_true[:-1]*(cs[:-1]-cs[1:]))
        cond_app = cond_app + cond_true[-1]*(cs[-1])
        cond_apps[i] = cond_app
    return cond_apps

# s1=30mS/m and s2=50mS/m, z=1m
sa_1=forward_model ([30, 50], [0, 1], [0.32], "hcp")
sa_2=forward_model ([30, 50], [0, 1], [0.71], "hcp")
sa_3=forward_model ([30, 50], [0, 1], [1.18], "hcp")
sa_4=forward_model ([30, 50], [0, 1], [0.32], "vcp")
sa_5=forward_model ([30, 50], [0, 1], [0.71], "vcp")
sa_6=forward_model ([30, 50], [0, 1], [1.18], "vcp")

data=numpy.array([sa_1, sa_2, sa_3, sa_4, sa_5, sa_6])

#
for i in range (10,110, 10):
    for j in range (10,110, 10):
        cond_HC1=forward_model ([j, i], [0, 1], [0.32], "hcp")
        cond_HC2=forward_model ([j, i], [0, 1], [0.71], "hcp")
        cond_HC3=forward_model ([j, i], [0, 1], [1.18], "hcp")
        cond_VC1=forward_model ([j, i], [0, 1], [0.32], "vcp")
        cond_VC2=forward_model ([j, i], [0, 1], [0.71], "vcp")
        cond_VC3=forward_model ([j, i], [0, 1], [1.18], "vcp")

    
        predicted=numpy.array([cond_HC1, cond_HC2, cond_HC3, cond_VC1, cond_VC2, cond_VC3])
    
        rms=numpy.array(sqrt(sum((predicted - data)**2).mean()))
        
        

        x = numpy.linspace(10,100,10)
        y = numpy.linspace(10,100,10)
        X,Y=numpy.meshgrid(x,y)
        Z=rms
    
        contour = plt.contour(X, Y, Z)

标签: python

解决方案


推荐阅读