Взятие среднего из списка без учета нулевых значений - PullRequest
0 голосов
/ 25 октября 2018

Я хотел бы принять среднее значение для каждого столбца, игнорируя нулевые значения в каждом столбце.Массив:

array([[ 12.,  26.,   0.,   0.,   0.,   0.,   0.,   0.],
       [ 12.,  27.,  36.,  46.,  56.,  66.,   0.,   0.],
       [ 13.,  22.,  38.,  50.,  66.,  81.,  94., 107.],
       [  3.,   0.,   0.,   0.,   0.,   0.,   0.,   0.]])

Результат будет:

[10,25,37,48,61,73.5,94,107]

Спасибо!

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

Вы можете использовать numpy.true_divide, чтобы разделить сумму массива на количество ненулевых элементов, что является довольно быстрым:

np.true_divide(A.sum(0), (A != 0).sum(0))

array([ 10. ,  25. ,  37. ,  48. ,  61. ,  73.5,  94. , 107. ])

Производительность

A = np.random.randint(0, 10, (10000, 10000)).astype(float)

In [71]: %timeit np_nanmean(A)
1.73 s ± 3.48 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [72]: %timeit np_masked_nanmean(A)
1.93 s ± 7.42 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [73]: %timeit np_true_divide(A)
319 ms ± 5.61 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
0 голосов
/ 26 октября 2018
lst = [[ 12.,  26.,   0.,   0.,   0.,   0.,   0.,   0.],
   [ 12.,  27.,  36.,  46.,  56.,  66.,   0.,   0.],
   [ 13.,  22.,  38.,  50.,  66.,  81.,  94., 107.],
   [  3.,   0.,   0.,   0.,   0.,   0.,   0.,   0.]]
result_lst = map(lambda x:sum(x)/len(x),[tup if 0.0 not in tup else filter(lambda x: x != 0.0,tup) for tup in map(list,zip(*lst))])
print result_lst
Result : [10.0, 25.0, 37.0, 48.0, 61.0, 73.5, 94.0, 107.0]

Привет, я знаю, что мы можем получить вывод разными способами, но я не хочу использовать какие-либо Модули (numpy), я просто хочу использовать список Сжатия, чтобы получить наш результат,Позвольте мне объяснить, как мне это сделать:

  1. map(list,zip(*lst)) выдаст список списков для сравнения на основе индекса
  2. filter функция выдаст список без нулей
  3. наконец мы находим среднее значение

Направь меня, если я смогу сделать какое-нибудь эффективное изменение в моем сжатии списка

0 голосов
/ 25 октября 2018

У вас есть массив NumPy, поэтому используйте NumPy.Один из способов - преобразовать значения 0 в NaN, а затем использовать np.nanmean:

A = np.array([[ 12.,  26.,   0.,   0.,   0.,   0.,   0.,   0.],
              [ 12.,  27.,  36.,  46.,  56.,  66.,   0.,   0.],
              [ 13.,  22.,  38.,  50.,  66.,  81.,  94., 107.],
              [  3.,   0.,   0.,   0.,   0.,   0.,   0.,   0.]])

B = A.copy()
B[B == 0] = np.nan
res = np.nanmean(B, axis=0)

print(res)

array([  10. ,   25. ,   37. ,   48. ,   61. ,   73.5,   94. ,  107. ])

или использовать маскированные массивы через np.ma.masked_where:

import numpy.ma as ma

res = np.nanmean(ma.masked_where(A == 0, A), axis=0).data
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...