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()
Другие вопросы по тегам