Переформулируйте проблему немного. Вы знаете длину списка и какую долю чисел в списке следует учитывать. Учитывая это, вы можете определить разницу между первым и последним индексами в списке, которые дают вам желаемый диапазон. Тогда цель состоит в том, чтобы найти индексы, которые минимизируют функцию стоимости, соответствующую желаемым симметричным значениям относительно медианы.
Пусть меньший индекс будет n1
, а больший индекс - n2
; они не независимы. Значения из списка по индексам x[n1] = m-b
и x[n2]=m+c
. Теперь вы хотите выбрать n1
(и, следовательно, n2
), чтобы b
и c
были как можно ближе. Это происходит, когда (b - c)**2
минимально. Это довольно просто, используя numpy.argmin
. Параллельно с примером в вопросе, вот интерактивная сессия, иллюстрирующая подход:
$ python
Python 2.6.5 (r265:79063, Jun 12 2010, 17:07:01)
[GCC 4.3.4 20090804 (release) 1] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> theList = np.log10(1+np.arange(.1, 100))
>>> theMedian = np.median(theList)
>>> listHead = theList[0:30]
>>> listTail = theList[-30:]
>>> b = np.abs(listHead - theMedian)
>>> c = np.abs(listTail - theMedian)
>>> squaredDiff = (b - c) ** 2
>>> np.argmin(squaredDiff)
25
>>> listHead[25] - theMedian, listTail[25] - theMedian
(-0.2874888056626983, 0.27859407466756614)