Обработка нуля, умноженная на NaN - PullRequest
7 голосов
/ 19 июня 2019

Я пытаюсь оценить энтропию случайных величин (RV), которая включает вычисление шага: p_X * log(p_X).Например,

import numpy as np
X = np.random.rand(100)   
binX = np.histogram(X, 10)[0] #create histogram with 10 bins
p_X = binX / np.sum(binX)
ent_X = -1 * np.sum(p_X * np.log(p_X))

Иногда p_X должен быть нулем, что математически делает весь член нулем.Но python делает p_X * np.log(p_X) как NaN и делает полное суммирование как NaN.Есть ли способ управлять (без какой-либо явной проверки NaN), заставляя p_X * np.log(p_X) давать ноль всякий раз, когда p_X равен нулю?Любое понимание и исправление приветствуется и спасибо заранее :)

Ответы [ 3 ]

6 голосов
/ 19 июня 2019

Если у вас есть scipy, используйте scipy.special.xlogy(p_X,p_X).Это не только решает вашу проблему, но и дает дополнительное преимущество, оно также немного быстрее, чем p_X*np.log(p_X).

4 голосов
/ 19 июня 2019

В вашем случае вы можете использовать nansum, поскольку добавление 0 в sum - это то же самое, что игнорирование NaN:

ent_X = -1 * np.nansum(p_X * np.log(p_X))
4 голосов
/ 19 июня 2019

Вы можете использовать np.ma.log, который будет маскировать 0 с, и использовать метод filled для заполнения маскируемого массива 0:

np.ma.log(p_X).filled(0)

Например:

np.ma.log(range(5)).filled(0)
# array([0.        , 0.        , 0.69314718, 1.09861229, 1.38629436])

X = np.random.rand(100)   
binX = np.histogram(X, 10)[0] #create histogram with 10 bins
p_X = binX / np.sum(binX)
ent_X = -1 * np.sum(p_X * np.ma.log(p_X).filled(0))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...