Пусть M и N будут целыми числами. Одному дается один вектор s размера (M, 1), один вектор p размера (N, 1) и одна матрица u0 размера (M, N).
Предположим, что кто-то хочет построить 3D-график (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
Тем не менее, размеры совпадают! Есть ли способ 3D-построения u0 по сетке (s, p), не используя функцию arange для сетки ( cf слишком много повторяющихся примеров при https://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html#d-plots-in-3d)?
РЕДАКТИРОВАТЬ: Здесь 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()