Как создать гистограмму массива с замаскированными значениями в Numpy? - PullRequest
15 голосов
/ 31 августа 2010

В Numpy 1.4.1, каков самый простой или эффективный способ вычисления гистограммы массива с маской ?numpy.histogram и pyplot.hist подсчитывают маскированные элементы по умолчанию!

Единственное простое решение, о котором я могу подумать сейчас, заключается в создании нового массива с немаскированным значением:

histogram(m_arr[~m_arr.mask])

Это не очень эффективно, так как это создает ненужный новый массив.Я был бы рад прочитать о лучших идеях!

Ответы [ 3 ]

14 голосов
/ 03 сентября 2010

(Отмена удаления в соответствии с обсуждением выше ...)

Я не уверен, посчитают ли эти тупые разработчики это ошибкой или ожидаемым поведением.Я спросил в списке рассылки , так что, думаю, посмотрим, что они скажут.

В любом случае, это легко исправить.Исправление numpy/lib/function_base.py для использования numpy.asanyarray вместо numpy.asarray на входах функции позволит ей правильно использовать маскированные массивы (или любой другой подкласс ndarray) без создания копии.

Редактировать: Кажется, что это ожидаемое поведение. Как обсуждено здесь :

Если вы хотите игнорировать маскированные данные, это просто дополнительный вызов функции

гистограмма (m_arr.compressed ())

Я не думаю, что тот факт, что это делает дополнительную копию, будет уместным, потому что я предполагаю, что обработка полностью замаскированного массива внутри гистограммы будет намного дороже.

Использование asanyarray также позволило бы использовать матрицы и другиеподтипы, которые могут неправильно обрабатываться вычислениями гистограммы.

Для чего-либо еще, кроме отбрасывания замаскированных наблюдений, необходимо выяснить, каково определение гистограммы в замаскированном массиве, как указал Брюс.*

9 голосов
/ 02 сентября 2010

Попробуйте hist(m_arr.compressed()).

4 голосов
/ 27 февраля 2016

Это очень старый вопрос, но сейчас я просто использую:

numpy.histogram(m_arr, bins=.., range=.., density=False, weights=m_arr_mask)

, где m_arr_mask - это массив такой же формы, что и m_arr, состоящий из 0 значений для элементов.m_arr для исключения из гистограммы и 1 значения для элементов, которые должны быть включены.

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