用Python从3个矩阵中存储的数据实现三维绘图

用Python从3个矩阵中存储的数据实现三维绘图,python,matplotlib,plot,3d,Python,Matplotlib,Plot,3d,设M和N为整数。一个给定一个大小为M,1的向量s,一个大小为N,1的向量p和一个大小为M,N的矩阵u0 假设想要三维绘制s,p作为网格,u0作为绘制z轴的函数。当一个人写道: fig = plt.figure() ax = fig.gca(projection='3d') surf = ax.plot_surface(s, p, u0, cmap=cm.coolwarm, linewidth=0, antialiased=False) fig.colorba

设M和N为整数。一个给定一个大小为M,1的向量s,一个大小为N,1的向量p和一个大小为M,N的矩阵u0

假设想要三维绘制s,p作为网格,u0作为绘制z轴的函数。当一个人写道:

fig = plt.figure()
ax = fig.gca(projection='3d')
surf = ax.plot_surface(s, p, u0, cmap=cm.coolwarm,
                   linewidth=0, antialiased=False)
fig.colorbar(surf, shrink=0.5, aspect=5)

plt.show()
终端显示以下错误消息:

ValueError: shape mismatch: objects cannot be broadcast to a single shape
然而,尺寸确实匹配!有没有一种方法可以在网格s、p上绘制u0,而不使用arange函数来绘制网格cf?这是一个经常出现的例子

编辑:这里有一个MCVE。原始问题正是以下示例遇到的问题

import math
from math import *
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
from pylab import plot, axis, savefig, show, title, meshgrid, cm, imshow, contour, clabel, colorbar
from numpy import exp
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

#

M = 10
N = 20

h = 1/float(M)
l = 1/float(N)

#

s = np.zeros((M + 1, 1))
p = np.zeros((N + 1, 1))

for j in range(0, M + 1):
    s[j] = 0.0 + 5.0*j*h
for k in range(0, N + 1):
    p[k] = 0.0 + 20.0*k*l

#

u0 = np.zeros((M + 1, N + 1))

for j in range(0, M):
    for k in range(0, N):
        u0[j, k] = exp(-(s[j] + p[k] - 10)**2)

#

fig = plt.figure()
ax = fig.gca(projection='3d')
surf = ax.plot_surface(p, s, u0, cmap=cm.coolwarm,
                   linewidth=0, antialiased=False)
fig.colorbar(surf, shrink=0.5, aspect=5)

plt.show()

好的,我不确定输出是否正确,但这里是解决方案。在u0=np.zerosM+1,N+1之前添加以下行

并将打印命令替换为

surf = ax.plot_surface(sv, pv, u0.T, cmap=cm.coolwarm,
               linewidth=0, antialiased=False)
输出


你能提供a吗?S和p也应该是mxn。对于ech x和y点,有一个zpoint@Lucas补充道,谢谢你的建议。我想你已经交换了形状。p、 形状是21,1,试试wit p。T@Lucas巴辛加的答案解决了这个问题,你说的没错,我需要转换我的向量,再创建一个网格。谢谢你的帮助!它解决了我原来的问题,所以你的答案很好。干得好!非常感谢。
surf = ax.plot_surface(sv, pv, u0.T, cmap=cm.coolwarm,
               linewidth=0, antialiased=False)