matplotlib hist при игнорировании определенного значения без данных - PullRequest
6 голосов
/ 07 ноября 2011

У меня есть двумерный массив с 1.0e6 в качестве значения без данных.Я хотел бы сгенерировать гистограмму данных, и, хотя мне это удалось, это не самый лучший способ сделать это.

from matplotlib import pyplot
import sys

eps = sys.float_info.epsilon
no_data = 1.0e6

e_data = elevation.reshape(elevation.size)
e_data_clean = [ ]

for i in xrange(len(e_data)):
    val = e_data[i]
    # floating point equality check for val aprox not equal no_data
    if val > no_data + eps and val < no_data - eps:
        e_data_clean.append(val)

pyplot.hist(e_data_clean, bins=100)

Кажется, что должна быть чистота (и намного быстрееодин лайнер для этого).Есть ли?

1 Ответ

9 голосов
/ 07 ноября 2011

Вы можете использовать логический массив для выбора необходимых индексов:

selected_values = (e_data > (no_data + eps)) & (e_data < (no_data - eps))
pyplot.hist(e_data[selected_values])

(e_data > (no_data + eps)) создаст массив np.bool такой же формы, как и e_data, для которого установлено значение True взаданный индекс тогда и только тогда, когда значение этого индекса больше (no_data + eps).& является поэлементным оператором и , удовлетворяющим обоим условиям.

В качестве альтернативы, если no_data - это просто соглашение, я бы вместо этого установил эти значения на numpy.nan, ииспользуйте e_data[numpy.isfinite(e_data)].

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