У меня очень большой 1d-массив, большинство элементов которого равны нулю, в то время как ненулевые элементы сгруппированы вокруг нескольких островов, разделенных множеством нулей: (вот уменьшенная версия этого для целей MWE)
In [1]: import numpy as np
In [2]: A=np.array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,6,20,14,10,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,4,5,5,18,18,16,14,10,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,3,6,16,4,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])
Я хочу найти медиану и ее положение (даже приблизительно) с точки зрения индекса, соответствующего среднему значению каждого острова. Неудивительно, что я получаю ноль, чего я не хочу:
In [3]: np.median(A)
Out[3]: 0.0
In [4]: np.argsort(A)[len(A)//2]
Out[4]: 12
В случае одного острова ненулевых элементов, чтобы обойти это предостережение и удовлетворить мое требование, чтобы только ненулевые элементы были физически значимыми, я сначала удаляю все нули, а затем беру медианное значение оставшихся элементов:
In [5]: masks = np.where(A>0)
In [6]: A[masks]
Out[6]: array([ 1, 3, 6, 20, 14, 10, 5, 1])
На этот раз я правильно получил медиану нового массива, однако позиция (индекс) не будет правильной, поскольку она очевидна и также указывается в комментариях как некорректно определенная математически.
In [7]: np.median(A[masks])
Out[7]: 5.5
In [8]: np.argsort(A[masks])[len(A[masks])//2]
Out[8]: 2
В соответствии с этим приближением я знаю, что реальная медиана находится в третьем индексе модифицированного массива, но я хотел бы перевести ее обратно в формат исходного массива, где позиция (индекс) медианы должна быть где-то посередине. первого острова ненулевых элементов, соответствующих большему индексу (где все индексы нулей подсчитываются правильно). В комментариях также даны ответы на два предложения по определению положения медианы с учетом одного острова ненулевых элементов посреди моря нулей. Но что, если таких островов несколько? Как можно было вычислить индекс, соответствующий медиане каждого острова в контексте исходного массива гистограмм, где все нули считаются?
Мне интересно, есть ли какой-нибудь простой способ вычислить положение медианы в таких массивах из многих нулей. Если нет, что еще я должен добавить к своим строкам кода, чтобы сделать это возможным после того, как я узнал позицию в измененном массиве? Ваша помощь очень ценится.
np.median(masks)
? Какой ожидаемый п / п? Как насчет случая, когда имеется более одного островка ненулевых значений? - person Divakar   schedule 09.04.2018[3, 8, 9, 7, 2, 1, 9, 7]
равна 7, но как бы вы определили его положение? - person Warren Weckesser   schedule 09.04.2018A
гистограммой (т. Е. Массивом значений), и хотите ли вы получить медианное значение подсчитываемых значений? Тогда, возможно, сработает что-то вродеnp.searchsorted(A.cumsum(), A.sum()/2)
. - person Warren Weckesser   schedule 09.04.2018