невозможность исключить нулевые значения из списка - PullRequest
0 голосов
/ 14 июля 2020

Я реализовал al oop, чтобы исключить значения 0 из образца данных.

x=[1,4,4,7,11,13,15,15,17,18,19,19,20,20,22,23,28,29,31,32,36,37,47,48,49,50,54,54,55,59,59,61,61,66,72,72,75,78,78,81,93,96,99,108,113,114,120,120,120,123,124,129,131,137,145,151,156,171,176,182,188,189,195,203,208,215,217,217,217,224,228,233,255,271,275,275,275,286,291,312,312,312,315,326,326,329,330,336,338,345,348,354,361,364,369,378,390,457,467,498,517,566,644,745,871,1312,1357,1613,1630]
from numpy import linspace
import scipy.stats
import numpy as np
p_set=linspace(0.0,1,10,endpoint=True)
q_set=linspace(0.0,1,10,endpoint=True)
temp=0

for k in x:
    if (scipy.stats.gamma.pdf(k,2,1)==0.0):
    x.remove(k)
print(x)
for k in x:
    temp+=np.log(scipy.stats.gamma.pdf(k,2,1)).sum()

, но это появляется RuntimeWarning: разделить на ноль, обнаруженное в журнале

Я напечатал x, чтобы проверить, и понял, что два значения не исключены из списка. значения 0000000e + 000. в чем может быть причина? и как я с этим справлюсь ??

Ответы [ 4 ]

1 голос
/ 14 июля 2020

Использование list-comprehension:

x_lst=[1,4,4,7,11,13,15,15,17,18,19,19,20,20,22,23,28,29,31,32,36,37,47,48,49,50,54,54,55,59,59,61,61,66,72,72,75,78,78,81,93,96,99,108,113,114,120,120,120,123,124,129,131,137,145,151,156,171,176,182,188,189,195,203,208,215,217,217,217,224,228,233,255,271,275,275,275,286,291,312,312,312,315,326,326,329,330,336,338,345,348,354,361,364,369,378,390,457,467,498,517,566,644,745,871,1312,1357,1613,1630]

Чтобы удалить все сущности, содержащие 0, т.е. 1,2,50> 1,2:

print([x for x in x_lst if not '0' in str(x)])

Чтобы удалить только 0 из элемента, т.е. 1,2,50> 1,2,5:

print([int(str(x).strip('0')) if '0' in str(x) else x for x in x_lst ])
0 голосов
/ 14 июля 2020
x=[1,4,4,7,11,13,15,15,17,18,19,19,20,20,22,23,28,29,31,32,36,37,47,48,49,50,54,54,55,59,59,61,61,66,72,72,75,78,78,81,93,96,99,108,113,114,120,120,120,123,124,129,131,137,145,151,156,171,176,182,188,189,195,203,208,215,217,217,217,224,228,233,255,271,275,275,275,286,291,312,312,312,315,326,326,329,330,336,338,345,348,354,361,364,369,378,390,457,467,498,517,566,644,745,871,1312,1357,1613,1630]
x = [i for i in x if i != 0]

Сделаем за вас всю работу. ^ - ^

0 голосов
/ 14 июля 2020

Хотя я согласен с ответом Мишамейса, я хочу добавить еще одну вещь: вы можете использовать np.seterr(all="raise"), чтобы выдавать все numpy предупреждения как исключения. Таким образом, вам не нужно предварительно фильтровать значения и вы можете просто try исключить, если операции работают:

import scipy.stats
import numpy as np

x=[1,4,4,7,11,13,15,15,17,18,19,19,20,20,22,23,28,29,31,32,36,37,47,48,49,50,54,54,55,59,59,61,61,66,72,72,75,78,78,81,93,96,99,108,113,114,120,120,120,123,124,129,131,137,145,151,156,171,176,182,188,189,195,203,208,215,217,217,217,224,228,233,255,271,275,275,275,286,291,312,312,312,315,326,326,329,330,336,338,345,348,354,361,364,369,378,390,457,467,498,517,566,644,745,871,1312,1357,1613,1630]

np.seterr(all='raise')
temp = 0
for k in x:
    try:
        temp += np.log(scipy.stats.gamma.pdf(k, 2, 1)).sum()
    except FloatingPointError:
        pass
0 голосов
/ 14 июля 2020

Я бы использовал фильтр numpy вместо цикла по массиву, например:

x=[1,4,4,7,11,13,15,15,17,18,19,19,20,20,22,23,28,29,31,32,36,37,47,48,49,50,54,54,55,59,59,61,61,66,72,72,75,78,78,81,93,96,99,108,113,114,120,120,120,123,124,129,131,137,145,151,156,171,176,182,188,189,195,203,208,215,217,217,217,224,228,233,255,271,275,275,275,286,291,312,312,312,315,326,326,329,330,336,338,345,348,354,361,364,369,378,390,457,467,498,517,566,644,745,871,1312,1357,1613,1630]
from numpy import linspace
import scipy.stats
import numpy as np
p_set=linspace(0.0,1,10,endpoint=True)
q_set=linspace(0.0,1,10,endpoint=True)
temp=0
x = np.array(x)
x = x[np.where(scipy.stats.gamma.pdf(x,2,1)==0.0, False, True)]
print(x)
for k in x:
    temp+=np.log(scipy.stats.gamma.pdf(k,2,1)).sum()

Однако я также хотел бы указать, что сравнение любого плавающего значения с помощью ==, как правило, плохая идея из-за проблем с округлением и точностью (например, как описано в этом сообщении: Как лучше всего сравнивать числа с плавающей запятой на почти равенство в Python? )

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