【问题标题】:Numpy median precision issues at scale大规模的 Numpy 中值精度问题
【发布时间】:2020-07-17 02:26:46
【问题描述】:

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

我想知道这是否是典型的精度问题。有什么办法可以用其他类型或功能解决它吗?

我在这里附上一个随机生成的示例 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

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

【问题讨论】:

    标签: python numpy floating-point precision median


    【解决方案1】:

    我不确定您的假设是否正确。 为什么将数组的值更改为 -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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-05
      相关资源
      最近更新 更多