【发布时间】:2021-01-03 13:39:54
【问题描述】:
所以我有以下函数,它给定一个数字数组来删除异常值:
def reject_outliers(data, m = 1):
d = np.abs(data - np.median(data))
mdev = np.median(d)
s = d/mdev if mdev else 0
return np.array(data)[s<m]
vec_reject_outliers = np.vectorize(reject_outliers)
我想在多个多维数组中逐元素应用此函数。在下面的示例中,我尝试在列表中的 3 个嵌套数组之间找到每个元素的平均值:
a = np.array([np.array([4000, np.array([12,10])]), np.array([50, np.array([13, 11])]), np.array([51,np.array([30,20])])])
result = [vec_reject_outliers(l, m = 1).mean(axis = 0) for l in zip(*a)]
result 应该是[51, array([13, 11])],因为某些数字将被视为异常值,因此会从计算中删除。然而我得到的结果是[1367.0, array([18.33333333, 13.66666667])],这是在不省略任何元素的情况下计算的平均值。
有没有办法在这种情况下明智地执行reject_outliers 元素,或者我可以通过任何其他方式在任意维数组之间实现预期的result?
【问题讨论】:
-
你的多维数组在哪里?
a的形状是什么?看起来像 1d 与 object dtype。vectorize只是迭代外部数组。为什么不直接使用列表推导式? -
我希望这个函数能够在预先知道它们的维度的任何多维数组之间工作。 a里面是3个多维数组。
-
您的
a是二维的。有些元素是标量,有些是 1d。
标签: python arrays numpy multidimensional-array user-defined-functions