определить функцию, в которой используется min () - PullRequest
0 голосов
/ 28 мая 2019

Я пытаюсь определить функцию, в которой я хочу ограничить часть функции. Я пытаюсь сделать это с помощью min(), но он возвращает

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

Мой код:

def f(x, beta):
    K_w = (1+((0.5*D)/(0.5*D+x))**2)**2
    K_c = min(11,(3.5*(x/D)**(-0.5)))   # <-- this is what gives me the problem. It should limit K_c to 11, but that does not work.
    K_tot = (K_c**2+K_w**2+2*K_c*K_w*np.cos(beta))**0.5
    return K_tot

x = np.linspace(0, 50, 100)
beta = np.linspace(0, 3.14, 180)

X, Y = np.meshgrid(x, beta)
Z = f(X, Y)

fig = plt.figure()
ax = plt.axes(projection='3d')
ax.contour3D(X, Y, Z, 100, cmap = 'viridis')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z');

Я ожидал, что K_c будет ограничено 11, но это дало

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

Возможно, я делаю ошибку новичка, но помощь очень ценится!

1 Ответ

0 голосов
/ 28 мая 2019

Рассмотрите возможность использования np.clip, ссылки на который можно найти здесь .

np.clip(3.5*(x/D)**(-0.5), None, 11)

для вашего случая.

Например,

>>> import numpy as np
>>> np.clip([1, 2, 3, 15], None, 11)
array([ 1,  2,  3, 11])

Проблема с вашим кодом в том, что min сравнивает число со списком, которого это не ожидается.

В качестве альтернативы, вот подход к пониманию списка:

A = [1, 2, 3, 15]
B = [min(11, a) for a in A]
print(B)
...