Как использовать numpy.meshgrid для построения функции - PullRequest
0 голосов
/ 11 октября 2019

Я использую numpy.meshgrid метод для рисования трехмерного графика в Python. рисунок над переменными d1, d2, но у меня есть функция, состоящая из массива с 7 элементами, что 3 элемента не зависит от d1, d2. Когда я пытаюсь нарисовать свой график, я сталкиваюсь с этой ошибкой:

operands could not be broadcast together with shapes (7,) (120,120)

Когда я отлаживаю свой код, я вижу элементы массива, которые не зависят от d1, d2, имеют форму 1, нодругие имеют форму 120. Как я могу нарисовать такую ​​функцию, используя метод numpy.meshgrid?

Спасибо. Весь код выглядит следующим образом:

import numpy
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter

def function(a, b, c, d1, d2):
    Q = numpy.ones(7)

    EV = []
    EV.append(1 / (a + b))
    EV.append(1 / (a + b + c))
    EV.append(1 / (a + b + c))
    EV.append((1 - numpy.exp(-c * d1)) / c)
    EV.append((1 - numpy.exp(-c * d2)) / (c + a))
    EV.append((1 - numpy.exp(-c * d1)) / c)
    EV.append((1 - numpy.exp(-c * d2)) / (c + a))

    return numpy.sum(numpy.multiply(Q, EV) / numpy.sum(numpy.multiply(Q, EV)))


fig = plt.figure()
ax = fig.gca(projection='3d')

# Make data.
d1 = numpy.arange(0, 6, 0.05)
d2 = numpy.arange(0, 6, 0.05)
X, Y = numpy.meshgrid(d1, d2)

# Plot the surface.
ax.set_zlim(2.00, 8.00)
surf = ax.plot_surface(X, Y, function(1, 1, 1, X, Y), cmap='viridis', linewidth=0, antialiased=False)

# Customize the z axis.
ax.zaxis.set_major_locator(LinearLocator(10))
ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))

# Add a color bar which maps values to colors.
fig.colorbar(surf, shrink=0.5, aspect=5)

plt.show()

1 Ответ

1 голос
/ 11 октября 2019

Вы можете сделать что-то вроде

Z = np.array([[function(1, 1, 1, x, y) for x in d1] for y in d2])
surf = ax.plot_surface(X, Y, Z, cmap='viridis', linewidth=0, antialiased=False)

Сюжет не будет особенно интересным, хотя: во-первых, поэлементное умножение на массив единиц - это операция идентификации, поэтому np.multiply(Q, EV) - это операциятак же, как превращение EV в массив. Для любого массива a, np.sum(a / np.sum(a)) равно 1 (поскольку вы можете взять постоянный коэффициент np.sum(a) вне внешней суммы). Следовательно, function постоянно равно единице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...