Значение истинности массива с более чем одним элементом неоднозначно. Используйте a.any () или a.all (). В то время как построение 3D-графика - PullRequest
0 голосов
/ 22 апреля 2020
import numpy as np
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
import matplotlib.pyplot as plt

y = [4, 2]


def objectivedraw(a, b, y):
    return -1 * (y[0] + 0.75 * max((1 - b) * y[0] - (y[1] + a), 0) - 0.5 * max((y[1] + a) - (1 - b) * y[0], 0) \
                 + y[1] + 0.75 * max((1 - b) * y[1] - (y[0] + a), 0) - 0.5 * max((y[0] + b) - (1 - b) * y[1], 0))


a = np.arange(0, 3.0, 0.1)
b = np.arange(0, 1, 0.1)
A, B = np.meshgrid(a, b)  # grid of point
Z = objectivedraw(A, B,y)  # evaluation of the function on the grid

fig = plt.figure()
ax = fig.gca(projection='3d')
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1,
                       cmap=cm.RdBu, linewidth=0, antialiased=False)

ax.zaxis.set_major_locator(LinearLocator(10))
ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))

fig.colorbar(surf, shrink=0.5, aspect=5)

plt.show()

Это код, который я использую. Часть, связанная с построением графика, т. Е. После определения Z была скопирована с https://dzone.com/articles/how-plot-function-two (второй блок кода на веб-сайте). Я получаю сообщение об ошибке:

File "C:/Users/rohan/PycharmProjects/untitled/plot utility.py", line 12, in objectivedraw + y[1] + 0.75 * max((1 - b) * y[1] - (y[0] + a), 0) - 0.5 * max((y[0] + b) - (1 - b) * y[1], 0)) ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Я не могу понять, как это исправить. Я думаю, что это из-за моей функции.

РЕДАКТИРОВАТЬ: Я пытаюсь сделать функцию полезности Фер-Шмидт, так что это то, что функция.

1 Ответ

0 голосов
/ 22 апреля 2020

Для Z = objectivedraw(A, B, y) для работы с A и B, являющимися (2D) numpy массивами, и Z следует ожидать также массив numpy, функция objectivedraw должна быть совместима с numpy. В numpy функции в массиве выполняются поэлементно, например, np.sin(A) будет иметь то же количество элементов и такое же количество измерений, что и A, но все элементы будут заменены их синусом.

Декоратор @np.vectorize может сделать функцию векторизованной. Для совместимости с numpy операторы max следует заменить на np.maximum. Также векторизация не знает, как справиться со списком y. В этом случае элементы y могут передаваться один за другим.

import numpy as np
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
import matplotlib.pyplot as plt

@np.vectorize
def objectivedraw(a, b, y0, y1):
    return -1 * (y0 + 0.75 * np.maximum((1 - b) * y0 - (y1 + a), 0) - 0.5 * np.maximum((y1 + a) - (1 - b) * y0, 0)
                 + y1 + 0.75 * np.maximum((1 - b) * y1 - (y0 + a), 0) - 0.5 * np.maximum((y0 + b) - (1 - b) * y1, 0))

y = [4, 2]
a = np.arange(0, 3.0, 0.1)
b = np.arange(0, 1, 0.1)
A, B = np.meshgrid(a, b)  # grid of point
Z = objectivedraw(A, B, y[0], y[1])  # evaluation of the function on the grid

fig = plt.figure()
ax = fig.gca(projection='3d')
surf = ax.plot_surface(A, B, Z, rstride=1, cstride=1,
                       cmap=cm.RdBu, linewidth=0, antialiased=False)

ax.zaxis.set_major_locator(LinearLocator(10))
ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))

fig.colorbar(surf, shrink=0.5, aspect=5)

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