2013-11-07 3 views

ответ

3
>>> 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 раз медленнее.

+0

Это много для теста скорости, и ваш Идея np.mean (a [a! = - 999])! @ alexanderlukanin13 – 2964502

+0

Кстати, как можно применить способ 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

1

Я не знаю 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] 
+0

спасибо. но как вычислять среднее значение каждого списка отдельно внутри списка, избегая специального значения (-999)? A = [[4,5,7,8, -999], [3,8,5,7, -999]] M = [сумма (x)/len (x) для x в [y для y в A, если y! = -999] ' – 2964502

+2

, перечислимые ошибки выполняются быстро, но даже если это решение должно быть медленнее, чем другие, на основе массивов в масках и причудливой индексации ... –

3

В 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 
0
from numpy import* 
A = [4,5,7,8,-999] 
result = mean(A[A!=-999]) 
print (result) 
Смежные вопросы