python: неверное значение, встречающееся в true_divide - но где?
У меня есть вопрос, касающийся следующей проблемы:
Я хочу построить следующую простую функцию:
f (x) = x_1 * x_2 / (x_1 ^ 2 + x_2 ^ 2)
Если x & y равны нулю, вы делите на ноль, поэтому я добавил исключение, чтобы предотвратить этот случай:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
def f(x1, x2):
return np.where(np.logical_and(x1==0,x2==0),
0,
x1*x2/(x1*x1+x2*x2))
n = 3
x = y = np.linspace(-5,5,n)
xv, yv = np.meshgrid(x, y)
z = f(xv,yv)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(xv,yv,z)
plt.show()
Моя фигура является сюжетом, и если я проверяю свое решение, оно также кажется правильным. Однако, если я запускаю код, я получаю ошибку деления:
RuntimeWarning: invalid value encountered in true_divide
Я уже тестировал функцию np.where вручную, и она возвращает значение x_1=x_2=0 как true. Это похоже на работу.
Кто-нибудь знает, откуда это предупреждение?
1 ответ
Решение
Как уже было отмечено, вы будете оценивать каждый случай, используя np.where()
, Чтобы избежать ошибки, просто закодируйте ее на более низком уровне, например
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
def f(x1, x2):
shape = np.shape(x1)
y = np.zeros(shape)
for i in range(0,shape[0]):
for j in range(0,shape[1]):
if x1[i,j]!=0 and x2[i,j]!=0:
y[i,j] = x1[i,j]*x2[i,j]/(x1[i,j]*x1[i,j]+x2[i,j]*x2[i,j])
return y
n = 3
x = y = np.linspace(-5,5,n)
xv, yv = np.meshgrid(x, y)
z = f(xv,yv)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(xv,yv,z)
plt.show()