Как рассчитать среднее значение в списке, исключающее специальное значение (-999)?Как рассчитать среднее значение в списке, исключающее специальное значение?
import numpy as np
A = [4,5,7,8,-999]
M = np.mean(A)
Любая идея ???
Как рассчитать среднее значение в списке, исключающее специальное значение (-999)?Как рассчитать среднее значение в списке, исключающее специальное значение?
import numpy as np
A = [4,5,7,8,-999]
M = np.mean(A)
Любая идея ???
>>> import numpy as np
>>> a = np.array([1,2,3,4,5])
>>> np.mean(a)
3.0
>>> np.mean(a[a<=3])
2.0
>>> np.mean(a[a!=4])
2.75
Для случая ОП:
np.mean(A[A!=-999])
Производительность
Давайте протестируем три фрагмента текста: простые np.mean
, masked_array
и "наивным" решение с генераторами на Python. Массив имеет 1000000 значений.
from timeit import timeit
setup = 'import numpy as np; a=np.arange(0, 1000000)'
snippets = [
'assert np.mean(a[a!=999999]) == 499999.0',
'm=np.ma.masked_array(a,a==999999); assert np.ma.mean(m) == 499999.0',
'assert sum(x for x in a if x != 999999)/999999 == 499999'
]
timings = [timeit(x, setup=setup, number=10) for x in snippets]
print('\n'.join(str(x) for x in timings))
Результаты:
0.0840559005737
0.0890350341797
10.4104599953
Plain np.mean
и masked_array
имеют близкие моменты времени, в то время как "наивным" решение более чем в 100 раз медленнее.
Я не знаю numpy. Но это будет работать
A = [4,5,7,8,-999]
A = [item for item in A if item != -999]
print sum(A)/float(len(A))
Выход
6.0
Edit:
Чтобы найти средства всех подсписки
A = [[4,5,7,8,-999],[3,8,5,7,-999]]
M = [sum(z)/float(len(z)) for z in [[x for x in y if x != -999] for y in A]]
print M
Выход
[6.0, 5.75]
спасибо. но как вычислять среднее значение каждого списка отдельно внутри списка, избегая специального значения (-999)? A = [[4,5,7,8, -999], [3,8,5,7, -999]] M = [сумма (x)/len (x) для x в [y для y в A, если y! = -999] ' – 2964502
, перечислимые ошибки выполняются быстро, но даже если это решение должно быть медленнее, чем другие, на основе массивов в масках и причудливой индексации ... –
В NumPy вы можете использовать массив замаскированный в виду:
import numpy as np
A = np.array([4,5,7,8,-999])
mask_A = A == -999
ma_A = np.ma.masked_array(A, mask_A)
print np.ma.mean(ma_A)
Результаты в:
6.0
from numpy import*
A = [4,5,7,8,-999]
result = mean(A[A!=-999])
print (result)
Это много для теста скорости, и ваш Идея np.mean (a [a! = - 999])! @ alexanderlukanin13 – 2964502
Кстати, как можно применить способ np.mean (a [a! = - 999]) в случае нескольких массивов, пожалуйста, посмотрите на мой другой вопрос http://stackoverflow.com/questions/19835033/how-to-get-mean-of-every-list-inside-the-list-avoid--some-value @ alexanderlukanin13 – 2964502