python - 大规模的 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
注意:在同一数组上重新计算中位数会给出完全相同的结果,因此在程序的不同运行中没有精度损失或任何其他变化。
解决方案
我不确定你的假设是否正确。为什么将数组的值更改为 -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
推荐阅读
- flutter - 没有为类定义 getter 'Timer'
- c# - 如何使用 C# 和 SQL 在 asp.net 的中继器控制中显示列的总计
- python - OpenCV tesserocr 水印检测
- javascript - 如何更改日期选择器的宽度?
- python - Selenium 的 webdriver 在使用并行 webdriver 会话的 quit() 后未清除内存
- laravel - 类型错误:函数 Illuminate\Database\Eloquent\Builder::update() 的参数太少,0 已通过
- r - 在R中导入excel文件时如何防止将数字转换为科学形式?
- msbuild - NuGet MSBuild自动检测在TeamExplorer下找到MSBuild?
- php - 在 php 中清理存储的临时文件的正确方法是什么?
- qt - 为 QStackedBarSeries 设置 X 轴范围