小编Rya*_*nch的帖子

用于估计统计中位数,模式,偏度,峰度的"在线"(迭代器)算法?

是否有算法来估计值集的中值,模式,偏度和/或峰度,但这不需要一次将所有值存储在内存中?

我想计算基本的统计数据:

  • 平均值:算术平均值
  • 方差:平均偏差的平均值
  • 标准差:方差的平方根
  • 中位数:将较大一半的数字与较小的一半分开的值
  • mode:在集合中找到最频繁的值
  • 偏斜:tl; 博士
  • 峰度:tl; 博士

计算任何这些的基本公式是小学算术,我知道它们.还有许多统计库可以实现它们.

我的问题是我正在处理的集合中的大量(数十亿)值:在Python中工作,我不能只使用数十亿个元素创建列表或哈希.即使我用C语言编写,十亿元素数组也不太实用.

数据未排序.它是由其他过程随机,即时生成的.每组的大小变化很大,并且不会提前知道大小.

我已经弄清楚如何很好地处理均值和方差,以任何顺序迭代集合中的每个值.(实际上,在我的情况下,我按照它们生成的顺序来看它们.)这是我正在使用的算法,礼貌http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#On-line_algorithm:

  • 初始化三个变量:count,sum和sum_of_squares
  • 对于每个值:
    • 增量计数.
    • 将值添加到sum.
    • 将值的平方添加到sum_of_squares.
  • 按计数除以总和,作为变量均值存储.
  • 将sum_of_squares除以count,存储为变量mean_of_squares.
  • 平方均值,存储为square_of_mean.
  • 从mean_of_squares中减去square_of_mean,存储为方差.
  • 输出均值和方差.

这种"在线"算法存在缺陷(例如,精度问题,因为sum_of_squares快速增长大于整数范围或浮点精度),但它基本上给了我所需要的,而不必存储每个集合中的每个值.

但我不知道是否存在类似的技术来估计额外的统计数据(中位数,模式,偏度,峰度).只要处理N值所需的内存远小于O(N),我就可以使用有偏差的估计器,或者甚至是在一定程度上损害精度的方法.

如果库具有"在线"计算这些操作中的一个或多个的功能,那么将我指向现有的统计库也会有所帮助.

algorithm statistics iterator median

84
推荐指数
4
解决办法
3万
查看次数

在元组或对象列表上使用Python的list index()方法?

Python的列表类型有一个index()方法,它接受一个参数并返回匹配参数的列表中第一个项的索引.例如:

>>> some_list = ["apple", "pear", "banana", "grape"]
>>> some_list.index("pear")
1
>>> some_list.index("grape")
3
Run Code Online (Sandbox Code Playgroud)

是否有一种优雅(惯用)方式将其扩展到复杂对象列表,如元组?理想情况下,我希望能够做到这样的事情:

>>> tuple_list = [("pineapple", 5), ("cherry", 7), ("kumquat", 3), ("plum", 11)]
>>> some_list.getIndexOfTuple(1, 7)
1
>>> some_list.getIndexOfTuple(0, "kumquat")
2
Run Code Online (Sandbox Code Playgroud)

getIndexOfTuple()只是一个假设的方法,它接受一个子索引和一个值,然后返回该子索引上具有给定值的列表项的索引.我希望

有没有办法实现这样的一般结果,使用列表推导或lambas或类似的"内联"?我想我可以编写自己的类和方法,但如果Python已经有办法,我不想重新发明轮子.

python tuples list reverse-lookup

53
推荐指数
5
解决办法
18万
查看次数

在Python中,如何找到列表中第一项不是某些值的索引?

Python的列表类型有一个索引(x)方法.它接受单个参数x,并返回列表中具有值x的第一个项的(整数)索引.

基本上,我需要反转索引(x)方法.我需要获得一个没有值x的列表中第一个值的索引.我甚至可能只使用一个函数来返回第一个项的索引值!=无.

我可以想到一个带有递增计数器变量的'for'循环实现,但我觉得我错过了一些东西.是否存在可以处理此问题的现有方法或单行Python构造?

在我的程序中,当我处理从复杂的正则表达式匹配返回的列表时,情况出现了.每个列表中除一个项目外的所有项目都具有值None.如果我只需要匹配的字符串,我可以使用列表理解,如'[x for [my_list]中的x,如果x不是None]',但是我需要索引才能找出我的正则表达式中的哪个捕获组实际导致的比赛.

python indexing methods list

16
推荐指数
2
解决办法
1万
查看次数

Subversion客户端(svn)可以将符号链接视为文件吗?

我在Linux系统上有一个目录,主要包含不同文件系统上文件的符号链接.我想将目录添加到Subversion存储库,解除引用过程中的符号链接(将它们视为它们指向的文件,而不是链接).通常,我希望能够使用此行为处理任何工作副本操作,但我认为'svn add'命令是它启动的地方.

SVN客户端实用程序似乎没有与工作副本中的符号链接解除引用相关的任何选项.我也没有在手册(http://svnbook.red-bean.com/en/1.5/index.html)中找到任何引用.

我在SVN用户邮件列表上发现了一张海报,他提出了同样的问题,但从未收到过答案,这里:

(那张海报最后使用的是硬链接而不是符号链接.在我的情况下,这种技术不是一种选择,因为真正的底层文件驻留在一个单独的文件系统上.)

我在Fedora 11上使用Subversion v1.6.1.

对于它的价值,我知道有其他工具/技术可以帮助估算这种行为,但由于各种原因我不得不放弃.我已经考虑过这些可能性了: - 一个"联合"安装,合并包含真实文件的所有目录,并将SVN工作副本目录作为联合中的"顶层"; - 将真实文件复制/移动到与SVN工作副本相同的文件系统,并使用硬链接而不是符号链接; - 非SVN版本控制系统.这些都是巧妙的想法,我相信它们是解决其他问题的好方法,但鉴于这种环境和情况的限制,它们不会起作用.

svn symlink dereference

10
推荐指数
1
解决办法
3867
查看次数

使用命令名/选项直接调用distutils'或setuptools'setup()函数,而无需解析命令行?

我想以一种稍微不同寻常的方式调用Python的distutils'或setuptools'setup()函数,但我不确定distutils是否适用于这种用法.

举个例子,假设我目前有一个'setup.py'文件,看起来像这样(从distutils文档逐字解码 - setuptools用法几乎相同):

from distutils.core import setup

setup(name='Distutils',
      version='1.0',
      description='Python Distribution Utilities',
      author='Greg Ward',
      author_email='gward@python.net',
      url='http://www.python.org/sigs/distutils-sig/',
      packages=['distutils', 'distutils.command'],
     )
Run Code Online (Sandbox Code Playgroud)

通常,只为这个模块的RPM构建.spec文件,我可以运行python setup.py bdist_rpm --spec-only,它解析命令行并调用'bdist_rpm'代码来处理RPM特定的东西..spec文件以'./dist'结尾.

如何更改我的setup()调用,以便它使用'--spec-only'选项运行'bdist_rpm'命令,无需解析命令行参数?我可以将命令名称和选项作为参数传递给setup()吗?或者,我可以手动构建命令行,并将其作为参数传递吗?

注意:我已经知道我可以在一个单独的进程中使用实际的命令行,使用os.system()或子进程模块或类似的东西来调用脚本.我试图避免使用任何类型的外部命令调用.我正在寻找一个在当前解释器中运行setup()的解决方案.

对于后台,我将一些发布管理shell脚本转换为单个Python程序.其中一项任务是运行'setup.py'来生成.spec文件,以进行进一步的预发布测试.运行'setup.py'作为外部命令,使用自己的命令行选项,似乎是一个尴尬的方法,它使程序的其余部分复杂化.我觉得可能有更多的Pythonic方式.

python distutils setuptools

8
推荐指数
1
解决办法
2506
查看次数

直接写入远程Git存储库,而不将对象添加到本地索引/存储库?

Git是否支持任何允许我直接从本地/工作树提交到远程存储库的命令?正常的工作流程需要"git add",至少要用文件内容的副本等填充对象数据库.

我知道这不是正常的,预期的Git工作流程.但我注意到Git已经支持直接从存储库下载,没有本地存储("git archive"),所以可能存在类似的上传操作似乎是合理的.

或者,如果核心Git本身没有这样的命令,那么任何第三方软件是否支持直接远程写入?

git

5
推荐指数
1
解决办法
1672
查看次数