среднее количество массивов с numpy без учета нулевых значений

Я работаю над numpy, и у меня есть несколько массивов с одинаковым размером и формой, например: a= [153 186 0 258] b=[156 136 156 0] c=[193 150 950 757] Я хочу получить среднее значение массивов, но я хочу, чтобы программа игнорировала нулевые значения в вычислениях. Итак, результирующий массив для этого примера будет: d=[167.333 157.333 553 507.5] это результат этого вычисления: d=[(153+156+193)/3 (186+136+150)/3 (156+950)/2 (258+757)/2]. Возможно ли это?


person f.ashouri    schedule 08.11.2012    source источник


Ответы (1)


В Python:

>>> a = [153, 186, 0, 258]
>>> b = [156, 136, 156, 0]
>>> c = [193, 150, 950, 757]
>>> import statistics
>>> [statistics.mean([x for x in s if x]) for s in zip(*[a, b, c])]
[167.33333333333334, 157.33333333333334, 553, 507.5]

В numpy:

>>> import numpy as np
>>> A = np.vstack([a,b,c])
>>> np.average(A, axis=0, weights=A.astype(bool))
array([ 167.33333333,  157.33333333,  553.        ,  507.5       ])

Если есть вероятность, что все значения в столбце могут равняться нулю, вы можете использовать замаскированные массивы, чтобы избежать проблемы, связанной с невозможностью нормализации (веса не могут быть суммированы до нуля). Неопределенные слоты на выходе будут замаскированы.

>>> a[0] = b[0] = c[0] = 0
>>> A = np.vstack([a,b,c])
>>> np.ma.average(A, axis=0, weights=A.astype(bool))
masked_array(data=[--, 157.33333333333334, 553.0, 507.5],
             mask=[ True, False, False, False],
             fill_value=1e+20)
>>> np.ma.average(A, axis=0, weights=A.astype(bool)).tolist()
[None, 157.33333333333334, 553.0, 507.5]
person wim    schedule 08.11.2012
comment
Мои массивы 1200 * 1200, и я попытался упростить его в вопросе. Кажется, что это не работает для массивов, у которых более одной строки. Как я могу это сделать? - person f.ashouri; 08.11.2012
comment
Предполагая, что вы хотите, чтобы ваш результат тоже имел форму (1200, 1200), используйте вместо этого np.dstack и усредняйте по оси глубины. Если вы хотите, чтобы форма вывода была (1200,), то я не вижу причин, по которым vstack все еще не работал бы. - person wim; 08.11.2012
comment
Отличный ответ! Я использовал np.ma.average() как надежное решение для случаев, когда сумма всех значений равна нулю. - person Jason Bellino; 08.11.2013