numpy: вычисление linspace, генерирующее nan.Как убрать пару точек из обоих массивов? - PullRequest
0 голосов
/ 11 марта 2019

Мне любопытно, есть ли элегантный способ решения проблемы ниже, предпочтительно используя как можно меньше строк кода и легко запомнить, возможно встроенную функцию numpy?

Допустим, у меня есть функция f (x), и я хочу быть ленивым и генерировать пространство np.lins в диапазоне x, которое нарочно генерирует значения x, где f (x) не определена, поэтому некоторые из точек из моя строка соответствует "nan" в массиве my f (x).

Мой вопрос заключается в том, как отфильтровать (или сгенерировать два новых массива), который сохраняет только пары точек (x, f (x)), где f (x)! = Nan?

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-2,2,20)

with np.errstate(all='ignore'):
   fx = np.sqrt(x**2 - 1)

# here we can see "nan"
print(fx)

# want something here that removes 
#   (x[i], fx[i]) pair from arrays if x[i] has 'nan' as value
# <insert code>

plt.plot(x,fx)

Ответы [ 4 ]

3 голосов
/ 11 марта 2019

Нет необходимости отфильтровывать nan, они просто не отображаются.

enter image description here

Если вы хотите отфильтровать их, линия подключается.

 plt.plot(x[~np.isnan(fx)],fx[~np.isnan(fx)])

enter image description here

0 голосов
/ 11 марта 2019
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-5, 5,100)

with np.errstate(all='ignore'):
   f1 = np.sqrt(x**2 - 1)

# filter nan based on f1 position
f2  = f1[~np.isnan(f1)]
x2  = x[~np.isnan(f1)]

plt.plot(x2,f2, '.')
0 голосов
/ 11 марта 2019
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
x = np.linspace(-2,2,20)
#print(x)
with np.errstate(all='ignore'):
   fx = np.sqrt(x**2 - 1)

# here we can see "nan"
#print(fx)

#   (x[i], fx[i]) pair from arrays if x[i] has 'nan' as value
# <insert code>
a=pd.DataFrame({'Column1':x[:],'Column2':fx[:],}).dropna(inplace=True)
print(a)
plt.plot(a.Column1,a.Column2)
plt.xlabel("x")
plt.ylabel("fx")
0 голосов
/ 11 марта 2019

Вы можете попробовать это:

X_ = [(X) for (X,FX) in zip(x,fx) if math.isnan(FX)==False]
FX_ = [(FX) for FX in fx if math.isnan(FX)==False]

plt.plot(X_,FX_)

enter image description here

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