Scipy вычисляет U Манна Уитни по нескольким срезам

#python #arrays #numpy #scipy.stats

#питон #массивы #numpy #scipy.stats

Вопрос:

Учитывая следующие массивы:

 import numpy as np
from scipy.stats import mannwhitneyu

s1 = np.array([[1,2,3,4,5,6,7,8,0,10],[10,9,8,7,6,5,4,3,2,1]])
s2 = np.array([[1,11,3,7,5,6,7,8,0,10],[10,9,8,7,6,15,4,13,2,1]])
 

Я хочу запустить U-тест Манна-Уитни (-Уилкоксона) один раз для каждого фрагмента соответствующих выборок, и результаты будут заполнены в один выходной массив с одним фрагментом для статистики U, а другим для p-значения.
Я знаю, что могу управлять ими по отдельности следующим образом:

 r1 = mannwhitneyu(s1[0], s2[0])
r2 = mannwhitneyu(s1[1], s2[1])
 

Выходной сигнал:

 MannwhitneyuResult(statistic=39.5, pvalue=0.2239039981060696)
MannwhitneyuResult(statistic=37.0, pvalue=0.17162432050520815)
 

Желаемый результат:

 array([39.5, 0.2239039981060696], [ 37.0, 0.17162432050520815])
 

Я пробовал np.apply_along_axis , но аргумент массива принимает только один входной сигнал, а у меня их 2.
Кроме того, мне нужно как можно более быстрое решение, поскольку я буду делать это на тысячах фрагментов в рамках моделирования.

Заранее спасибо!

Ответ №1:

Вы могли бы использовать map(...) , это лучший выбор, и довольно быстрее, чем, np.apply_along_axis(...) , поскольку он использует цикл python внутри, и некоторые из вычислительно дорогостоящих операций, т.Е. transpose(...) И view(...) , поэтому при обычных обстоятельствах даже перебор массива Numpy с использованием цикла python будет быстрее.


 import numpy as np
from scipy.stats import mannwhitneyu

s1 = np.array([[1,2,3,4,5,6,7,8,0,10],[10,9,8,7,6,5,4,3,2,1]])
s2 = np.array([[1,11,3,7,5,6,7,8,0,10],[10,9,8,7,6,15,4,13,2,1]])

idx = np.arange(len(s1))
 

 def step(i):

  return [*mannwhitneyu(s1[i], s2[i])]
 

 np.array(list(map(step, idx)))
 

Комментарии:

1. Что делает звездочка в команде return? Я попробовал это с помощью пользовательской функции, которую я создал, но мне пришлось удалить звездочку, чтобы заставить ее работать.

2. Asterisk распаковывает итеративный объект, вы можете проверить выходной массив, форму, если вы его удалите, np.array(list(map(step, idx))).shape