Python: Значение истинности массива с более чем одним элементом неоднозначно.Используйте a.any () или a.all () - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть функция, которую мне нужно вычислить и визуализировать для диапазона аргументов.

Вот пример кода Jupyter:

%pylab
%matplotlib inline  
%matplotlib notebook
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter

def testFunc(x):
    a = x[0] - x[1]

    #if a < 0:
    #    a = 0

    b = 2*(a**3)
    return b

X = np.arange(100, 10000, 10)
Y = np.arange(3600, 3900, 10)
X, Y = np.meshgrid(X, Y)
Z = testFunc([X, Y])

fig = plt.figure(figsize=(12,8))
ax = fig.gca(projection='3d')
surf = ax.plot_surface(X, Y, Z, cmap=cm.coolwarm)
fig.colorbar(surf, shrink=0.5, aspect=5)
plt.show()

Работает нормально: enter image description here

НО Мне нужно добавить дополнительную логику к функции:

if a < 0:
    a = 0

Когда я раскомментирую эти строки, я получаю ошибку:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-15-273b40ed507a> in <module>()
     20 Y = np.arange(3600, 3900, 10)
     21 X, Y = np.meshgrid(X, Y)
---> 22 Z = testFunc([X, Y])
     23 
     24 fig = plt.figure(figsize=(12,8))

<ipython-input-15-273b40ed507a> in testFunc(x)
     11     a = x[0] - x[1]
     12 
---> 13     if a < 0:
     14         a = 0
     15 

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Применяет ли функция массив значений в «a»?Поэтому он не знает, какой элемент сравнивать с «0».

Не могли бы вы порекомендовать хороший способ вычисления функции с условиями для диапазона атрибутов (с возможностью его визуализации)?

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Ну, X и Y - это массивы.Когда вы передаете массив массивов в testFunc, тогда a также является массивом.Вам необходимо сравнить элементы a, чтобы проверить, меньше ли они 0, а затем установить их в 0 (например, с циклом for)

0 голосов
/ 04 декабря 2018

Есть несколько вариантов: здесь 2 (прокомментируйте тот, который вы не хотите использовать):

def testFunc(x):
    a = x[0] - x[1]

    # option 1:
    a[a<0] = 0
    # option 2
    a = np.clip(a,0,np.inf)

    b = 2*(a**3)
    return b

Результат после построения с вашим кодом:

enter image description here

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