大型数据集的滚动中值-python

大型数据集的滚动中值-python,python,numpy,pandas,scipy,median,Python,Numpy,Pandas,Scipy,Median,我有一个20万行的大文件,我需要通过计算每行中不同的单词来找出滚动中值 我使用numpy计算中位数,如下所示 a = np.array([]) np.insert(a, 0, len(unique_word_list_by_line)) median = np.median(a) 我觉得这样做效率不高,因为每当我插入一个元素时,numpy都会创建一个新数组。有没有办法将一个元素插入原地的numpy数组 感谢动态填充numpy数组从来都不是一件好事,它涉及到调整大小和复制 滚动

我有一个20万行的大文件,我需要通过计算每行中不同的单词来找出滚动中值

我使用numpy计算中位数,如下所示

   a = np.array([])
   np.insert(a, 0, len(unique_word_list_by_line))
   median = np.median(a)
我觉得这样做效率不高,因为每当我插入一个元素时,numpy都会创建一个新数组。有没有办法将一个元素插入原地的numpy数组


感谢

动态填充numpy数组从来都不是一件好事,它涉及到调整大小和复制

滚动中值并不像看上去那样微不足道。 讨论不同的实现,例如

编辑:看来你用熊猫了。在已实现的实现中,使用跳过列表和跳过NaN的实现。看一看


在纯python中也可以找到它的实现方法。

动态填充numpy数组从来都不好,它涉及调整大小和复制

滚动中值并不像看上去那样微不足道。 讨论不同的实现,例如

编辑:看来你用熊猫了。在已实现的实现中,使用跳过列表和跳过NaN的实现。看一看


还可以找到用纯python实现它的方法。

我建议这样做。假设已将文本文件加载到
文件中
,则可以创建列表
a
,如下所示:

a = []
for line in file:
    a.append(num_unique_words(line))
这里我假设您有一个函数
num\u unique\u words
,它计算字符串中唯一单词的数量

现在将其转换为数组:

a = np.array(a)
现在在数组中调用
np.median
(请注意,视图是由数组创建的:

median = np.empty_like(a)
for idx in xrange(len(a)):
    median[idx] = np.median(a[:idx])

我建议您这样做。假设您已将文本文件加载到
文件
,您可以创建列表
a
,如下所示:

a = []
for line in file:
    a.append(num_unique_words(line))
这里我假设您有一个函数
num\u unique\u words
,它计算字符串中唯一单词的数量

现在将其转换为数组:

a = np.array(a)
现在在数组中调用
np.median
(请注意,视图是由数组创建的:

median = np.empty_like(a)
for idx in xrange(len(a)):
    median[idx] = np.median(a[:idx])


问题是“NuPy比其他统计软件包好……”并不是很合适。它太模糊了:有太多的软件包需要比较。听起来,你要寻找的是帮助优化你的代码。你所拥有的是非常未优化的。考虑重写你的问题,询问如何优化你的代码的建议。特别是,您使用
np.insert
的速度非常慢,因为numpy每次迭代都要创建一个新数组。感谢您的评论,我现在更新了这个问题,您的示例代码中是否缺少
for
循环?问题“numpy比其他统计包好吗…”并不适合这样做。它太模糊了你要寻找的是帮助你优化代码的代码。你的代码非常不优化。考虑重写你的问题,询问如何优化你的代码的建议。特别是,你使用<代码> NP.INSERT 非常慢,因为NUMPY必须创建一个新的数组,每个迭代。ion.谢谢你的评论,我现在已经更新了这个问题,你的示例代码中是否缺少
for
循环?谢谢,但是每次我们向列表中添加新元素并调用np.median(列表)时,它不会创建numpy数组吗?我不明白,你每次读取文件中的一行时都需要计算中位数?是的,因为它是滚动中位数。我需要逐行读取,计算每行的唯一单词数,然后找到滚动中位数。例如:第1行-单词-5,第2行-单词7,第3行-单词10个中间位数将是5,(5+7)/2,7谢谢,但是每次我们向列表中添加新元素并调用np.median(列表)时,它不会创建numpy数组吗?我不明白,你每次读取文件中的一行时都需要计算中位数?是的,因为它是滚动中位数。我需要逐行读取,计算每行的唯一单词数,然后找到滚动中位数。例如:第1行-单词-5,第2行-单词7,第3行-单词10个中间位数将是5,(5+7)/2,7当然,每当您在此处调用
np.median
时,numpy确实会执行整个排序操作,而不是简单地将最近添加的值插入排序中。因此,@Kikohs answer提供指向速度肯定更快的方法的链接。很好。如果文件的全部内容(唯一字数)可以加载到内存中。但是如何修改此解决方案以适应无法装入内存的大型数据集?200000个条目并不是那么多,只是几兆字节左右。对吗?我是否遗漏了什么?你是对的@farenorth,我只是想看看这种方法是否可以扩展到非常大的数据集。在我看来,如果我们的文件太长了,您还有其他问题。特别是,您需要实现@Kikohs建议的那种快速“运行中值”。当然,每当您在此处调用
np.median
时,numpy确实会执行整个排序操作,而不是简单地将最近添加的值插入排序中。因此,@Kikohsanswer提供指向肯定会更快的方法的链接。Nice。如果文件的全部内容(唯一单词的数量)都相同,则此解决方案有效可以加载到内存中。但是如何修改此解决方案以适应无法装入内存的大型数据集?200000个条目并不是那么多,只是几兆字节左右。对吗?我是否遗漏了什么?你是对的@farenorth,我只是想看看这种方法是否可以扩展到非常大的数据集。在我看来,如果我们的文件太长了,您还有其他问题。特别是,您需要实现@Kikohs建议的那种快速“运行中间值”。