大规模的 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
在我的实验中,我有一个大型 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