大规模的 Numpy 中值精度问题

Numpy median precision issues at scale

在我的实验中,我有一个大型 2D np.ndarray X 类型 float64,尺寸为 25x431080。我想计算 0 轴上的逐元素中值以获得维度为 1x431080 的数组。假设我扭曲了原始数组的一行,使得中位数不受影响,例如,将其分配给原始元素范围之外的值。我的问题是中位数计算不会 return 与以前完全相同的数组。

我想知道这是否是典型的精度问题。有没有办法用另一种类型或函数解决它?

我在这里附上一个随机生成的例子s.t。可以重现问题

import numpy as np
x = np.random.uniform(-1,1,(25,431080))
med1 = np.median(x, axis = 0)
x[13,:] = -100*np.ones(x.shape[1]) # distort one row to -100
med2 = np.median(x, axis = 0)
np.array_equal(med1, med2) # returns False

注意:在同一个数组上重新计算中位数会给出完全相同的结果,因此在程序的不同运行中没有精度损失或任何其他变化。

我不确定你的假设是否正确。 为什么将数组的值更改为 -100 不会同时更改中位数?

while True:
    x1 = np.round(np.random.uniform(-1, 1, 10), 2)
    x2 = x1.copy()
    x2[3] = -100

    m1 = np.median(x1)
    m2 = np.median(x2)
    
    if m1 != m2:
        print(x1)
        print(x2)
        print(m1, m2)
        break

或者甚至更简单:示例数组 [1, 2, 3],中位数 2。 将其中一个初始值更改为 -100 通常也会更改中位数。但有时你很幸运。如果您使用 -100 更改小于中位数的值 中位数保持不变,但如果你交换一个大于或等于中位数的值,中位数就会改变。

x1 = [1,    2,    3] -> 2
x2 = [-100, 2,    3] -> 2
x3 = [1, -100,    3] -> 1
x4 = [1,    2, -100] -> 1