2016-09-07 55 views
1

我想知道是否有另一种编码方式 这个问题的核心是解决这个问题的最简单方法是读取文件并将值保存在名单。哪里,那么你就必须:Python 3.4计算模式,通过文件的中值读数

a = [1,2,3,4,5,6,1,1,1,1] 
import statistics 
listMode = statistics.mode(a) # median, average, etc... 

我想知道,而不必对这些值a保存(所以内存,因为它可以是相当大的),我是否可以动态计算模式,因为我读的文件并每次读取新行时更新一个值,即增量计算模式,中位数和平均值。所以最后我会有a = [mode,median,average]

+0

即使在一个非常大的数据集上,我也看不到这样简单的操作,因此我没有理由尝试计算“实时”,而是在最后完成所有操作 – TheLazyScripter

+0

“增量”是如何实现的需要?如果文件只能读取一次,您将需要为数据集中的每个唯一值存储至少一个值和一个计数。如果读取文件的次数与文件中的值的数量相同是可以接受的,则所需的存储空间将会减少,但执行时间会急剧增加。 – Simon

+0

我有一个相当平坦的嵌套字典,宁愿不要有一个巨大的名单,同样的道理,我想这样做的一些变量,它会让生活更干净。如果表现成为一个重要问题,那么这个选项就可以清楚了。但是,我在模式和中位数工作方面没有成功。平均水平要容易得多,并且经历了一次改进。 – FancyDolphin

回答

3

如果输入数字集合来自相当小的数值范围(如您的示例中所示),那么您可以使用Counter来计算每个值在您经过时看到的数量。从Counter你可以很容易地获得模式,并且可以轻松获得中位数。在飞行中计算平均值很简单,不需要Counter:只需保持运行总数和运行计数。

+0

这是相当大的,这只是一个简单的例子。计数器会改善,但增量方法会更可取。协议平均数甚至是加权平均数。 – FancyDolphin

+0

我没有看到没有计算每个值的确切模式的任何希望。只要您为某个值减少计数,对手就可以通过生成一组具有该值的条目来解决您的问题。然而,这篇文章谈到计算近似模式:http://stackoverflow.com/questions/1058813/on-line-iterator-algorithms-for-estimating-statistical-median-mode-skewnes –

+0

如果你知道一些关于分布的数据,您可以对其进行分类并计算每个存储桶中的条目数量。然后你可以通过使用最重的水桶的中点获得一个近似模式。 –