Как игнорировать точку данных NaN в массиве numpy и генерировать нормализованные данные в Python?
скажем, у меня есть массив numpy, который имеет некоторый float ('nan'), я не хочу вменять эти данные сейчас, и я хочу сначала нормализовать их и сохранить данные NaN в исходном пространстве, есть ли способ сделать это?
раньше я использовал на sklearn.Preprocessing
, но эта функция, похоже,не может принимать в качестве входных данных любой NaN-массив.
2 ответов
вы можете замаскировать свой массив с помощью numpy.ma.array
функция и впоследствии применить любой numpy
работы:
import numpy as np
a = np.random.rand(10) # Generate random data.
a = np.where(a > 0.8, np.nan, a) # Set all data larger than 0.8 to NaN
a = np.ma.array(a, mask=np.isnan(a)) # Use a mask to mark the NaNs
a_norm = a / np.sum(a) # The sum function ignores the masked values.
a_norm2 = a / np.std(a) # The std function ignores the masked values.
вы все еще можете получить доступ к необработанным данным:
print a.data
можно использовать numpy.nansum
чтобы вычислить норму и игнорировать nan:
In [54]: x
Out[54]: array([ 1., 2., nan, 3.])
вот норма с nan
игнорируется:
In [55]: np.sqrt(np.nansum(np.square(x)))
Out[55]: 3.7416573867739413
y
- нормированный массив:
In [56]: y = x / np.sqrt(np.nansum(np.square(x)))
In [57]: y
Out[57]: array([ 0.26726124, 0.53452248, nan, 0.80178373])
In [58]: np.linalg.norm(y[~np.isnan(y)])
Out[58]: 1.0