python - 根据 bool python 获取数组部分的中位数

标签 python numpy median

我有两个长度相同的数组,第一个是 bool 数组,第二个包含相应的值。

flag   = [0,0,0,1,1,0,0,0,1,1,1,1,0,1,1]
values = [1,5,6,8,5,6,2,0,1,9,3,8,3,6,2]

我想返回一个中位数数组,其中包含与 bool 矩阵中 1 的每个部分相对应的中值。

例如

flag   = [0,0,0,1,  1,  0,0,0, 1,  1,  1,  1, 0,1,1]
result = [0,0,0,6.5,6.5,0,0,0,5.5,5.5,5.5,5.5,0,4,4]

我不美观的做法是:

result = np.zeros(values.shape[0])
vect = []
idx = []
for n in np.arange(result.size):
    if flag[n] > 0:
        vect.append(values[n])
        idx.append(n)
    elif flag[n] == 0:
        result[idx] = np.median(vect)
        vect = []
        idx = []
    result[idx] = np.median(vect)

它工作得很好,但它不是很Pythonic并且非常慢,因为我使用非常大的数组。

最佳答案

我们可以使用 np.diff 来查找 0 和 1 之间的转换。然后循环遍历 0/1 和 1/0 转换对,并从其间的所有值中取中值。

生成的循环迭代每组。

flag   = [0,0,0,1,1,0,0,0,1,1,1,1,0,1,1]
values = [1,5,6,8,5,6,2,0,1,9,3,8,3,6,2]

d = np.diff(np.concatenate([[0], flag, [0]]))  # Add and append a 0 so the procedure also works if flags start or end with 1.

begin = np.flatnonzero(d==1)
end = np.flatnonzero(d==-1)

result = np.zeros_like(values, dtype=float)

for a, b in zip(begin, end):
    result[a:b] = np.median(values[a:b])

print(result)
# [ 0.   0.   0.   6.5  6.5  0.   0.   0.   5.5  5.5  5.5  5.5  0.   4.   4. ]

关于python - 根据 bool python 获取数组部分的中位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44160343/

相关文章:

python - 在 python 中,如何在后台将参数传递给嵌套函数?

python - 在 python 中使用 git 子模块

python - 跨组滚动唯一性 + pandas 中的时间

arrays - Julia 中多个数组的中位数

c++ - boost::accumulators::statistics 的中值输出令人困惑

python - 尝试绘制迭代但 plt.plot 为空

python - 如何在 OpenCV 中提取具有特定颜色的图像片段?

python - Python/Numpy 中的扫描线填充算法

python - 从 IronPython 使用 NumPy 和 SciPy 的 final方法

c - 实现几何中位数