#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