Поэлементная медиана и процентили массивов с числовым Python - PullRequest
3 голосов
/ 01 апреля 2012

Я использую Числовой Питон. К сожалению, NumPy не вариант. Если у меня есть несколько массивов, таких как:

a=Numeric.array(([1,2,3],[4,5,6],[7,8,9]))
b=Numeric.array(([9,8,7],[6,5,4],[3,2,1]))
c=Numeric.array(([5,9,1],[5,4,7],[5,2,3]))

Как вернуть массив, который представляет поэлементную медиану массивов a, b и c? ... например,

array(([5,8,3],[5,5,6],[5,2,3]))

И затем рассмотрим более общую ситуацию: как найти n процентилей каждого элемента, учитывая n чисел массивов? Например, вернуть массив, который представляет 30-й процентиль из 10 массивов. Большое спасибо за вашу помощь!

Ответы [ 3 ]

1 голос
/ 02 апреля 2012

Объедините ваш стек 2-D массивов в один 3-D массив, d = Numeric.array([a, b, c]) и затем сортируйте по третьему измерению.После этого последующие двумерные плоскости будут иметь порядок рангов, поэтому вы сможете извлекать плоскости для низких, высоких, квартилей, процентилей или медианы.

0 голосов
/ 24 июля 2018

Помещение описания Рэймонда Хеттингера в python:

a=Numeric.array(([1,2,3],[4,5,6],[7,8,9]))
b=Numeric.array(([9,8,7],[6,5,4],[3,2,1]))
c=Numeric.array(([5,9,1],[5,4,7],[5,2,3]))

d = Numeric.array([a, b, c])
d.sort(axis=0)

Поскольку существует n = 3 входных матриц, поэтому медиана будет равна средней, индексированной единицей,

print d[n//2]
[[5 8 3]
 [5 5 6]
 [5 2 3]]

А если бы у вас было 4 входных матрицы, вам нужно было бы получить средние элементы d [1] и d [2].

0 голосов
/ 01 апреля 2012

Ну, я не разбираюсь в Numeric, но я просто начну с наивного решения и посмотрим, сможем ли мы сделать его лучше.

Чтобы получить 30-й процентиль списка foo let x=0.3, отсортируйте список и выберите элемент в foo[int(len(foo)*x)]

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

Матрица в Numeric (как и numpy) - это массив с двумя измерениями.

Я думаю, что bar = Numeric.array(a,b,c) сделает Array, который вы хотите, и тогда вы можете получить n-й столбец с 'bar [:, n]', если Numeric имеет те же методы нарезки, что и Numpy.

foo = sorted(bar[:,n])
foo[int(len(foo)*x)]

Надеюсь, это поможет вам.

...