Получаете ли вы свои данные из текстового файла или аналогичного? Если это так, я бы предложил использовать функцию genfromtxt
напрямую для указания вашего маскированного значения:
In [149]: f = StringIO('0.0, 1.0, NA, 9.0')
In [150]: a = np.genfromtxt(f, delimiter=',', missing_values='NA', usemask=True)
In [151]: a
Out[151]:
masked_array(data = [0.0 1.0 -- 9.0],
mask = [False False True False],
fill_value = 1e+20)
Я думаю, что проблема в вашем примере заключается в том, что список python, который вы используете для инициализации массива numpy, имеет гетерогенные типы (числа с плавающей запятой и строка). Значения приводятся к строкам в массиве numpy, но функция masked_values
использует равенство с плавающей запятой, что приводит к странным результатам.
Вот один из способов преодоления этого путем создания массива с объектом dtype:
In [152]: d = np.array([0., 1., 'NA', 9.], dtype=object)
In [153]: e = ma.masked_values(d, 'NA')
In [154]: e
Out[154]:
masked_array(data = [0.0 1.0 -- 9.0],
mask = [False False True False],
fill_value = ?)
Вы можете предпочесть первое решение, так как результат имеет тип с плавающей запятой.