Маскированные массивы - с указанием пропущенных значений - PullRequest
5 голосов
/ 02 июля 2011
import numpy as np
import numpy.ma as ma

"""This operates as expected with one value masked"""
a = [0., 1., 1.e20, 9.]
error_value = 1.e20
b = ma.masked_values(a, error_value)
print b

"""This does not, all values are masked """
d = [0., 1., 'NA', 9.]
error_value = 'NA'
e = ma.masked_values(d, error_value)
print e

Как я могу использовать 'nan', 'NA', 'None' или какое-либо подобное значение для указания отсутствующих данных?

Ответы [ 2 ]

4 голосов
/ 02 июля 2011

Получаете ли вы свои данные из текстового файла или аналогичного? Если это так, я бы предложил использовать функцию 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 = ?)

Вы можете предпочесть первое решение, так как результат имеет тип с плавающей запятой.

0 голосов
/ 09 июля 2011

Это решение работает, оно вызывает создание копии массива.

a_true = (a == 'NA')

a[a_true] = 1.e20

a = a.astype(float)

print a

error_value = 1.e20

b = ma.masked_values(a, error_value)

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