0

给定以下数组:

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]])

我想为各个样本的每个切片运行一次 Mann-Whitney(-Wilcoxon) 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 个。此外,我需要尽可能快的解决方案,因为作为模拟的一部分,我将在数千个切片上执行此操作。

提前致谢!

4

1 回答 1

1

您可以使用map(...), 是最好的选择,并且比 , 快得多np.apply_along_axis(...),因为它在内部使用python 循环,以及一些计算成本高的操作, transpose(...)and view(...),因此在通常情况下,即使使用 python 循环遍历 Numpy 数组也会更快。


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)))
于 2021-02-13T22:39:17.157 回答