2017-06-01 6 views
0

私は次のような問題について質問があります。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の値を返します。それはうまくいくようです。

誰もがこの警告の原因を知っていますか?

+0

のような低いレベルでコードを作成するだけです。あなたのコードはうまく動作し、グラフをプロットします – MaxU

+0

'np.where()'への引数はすべて*評価されているので、そのように使用してもエラーは解消されません。 –

+0

@ WarrenWeckesser私があなたを正しく理解していれば、x1 = x2 /(x1 * x1 + x2 * x2) 'もx1 = x2 = 0に対して評価されます。これを解決するにはnp.where()よりも良い方法を知っていますか? –

答えて

0

指摘されているように、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() 
関連する問題