首页 > 解决方案 > 大规模的 Numpy 中值精度问题

问题描述

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

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

我在这里附上一个随机生成的示例,可以重现该问题

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

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

标签: pythonnumpyfloating-pointprecisionmedian

解决方案


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

推荐阅读