【发布时间】:2019-11-10 11:09:58
【问题描述】:
关于this answer,有没有一种快速的方法来计算具有不等个元素的组的数组的中位数?
例如:
data = [1.00, 1.05, 1.30, 1.20, 1.06, 1.54, 1.33, 1.87, 1.67, ... ]
index = [0, 0, 1, 1, 1, 1, 2, 3, 3, ... ]
然后我想计算每个组的数字和中位数之间的差异(例如,0 组的中位数是1.025,所以第一个结果是1.00 - 1.025 = -0.025)。所以对于上面的数组,结果会显示为:
result = [-0.025, 0.025, 0.05, -0.05, -0.19, 0.29, 0.00, 0.10, -0.10, ...]
由于np.median.reduceat 不存在(还),是否有另一种快速的方法来实现这一点?我的数组将包含数百万行,因此速度至关重要!
可以假设索引是连续且有序的(如果不是,则很容易转换它们)。
性能比较示例数据:
import numpy as np
np.random.seed(0)
rows = 10000
cols = 500
ngroup = 100
# Create random data and groups (unique per column)
data = np.random.rand(rows,cols)
groups = np.random.randint(ngroup, size=(rows,cols)) + 10*np.tile(np.arange(cols),(rows,1))
# Flatten
data = data.ravel()
groups = groups.ravel()
# Sort by group
idx_sort = groups.argsort()
data = data[idx_sort]
groups = groups[idx_sort]
【问题讨论】:
-
您是否对链接答案中的
scipy.ndimage.median建议计时?在我看来,每个标签不需要相同数量的元素。还是我错过了什么? -
那么,当您说数百万行时,您的实际数据集是二维数组吗?您正在对每一行执行此操作?
-
@Divakar 查看对测试数据问题的编辑
-
您已经在初始数据中给出了基准,我对其进行了膨胀以保持格式相同。一切都以我的膨胀数据集为基准。现在改不合理
标签: python performance numpy median numpy-ufunc