【问题标题】:How to nicely handle [:-0] slicing?如何很好地处理 [:-0] 切片?
【发布时间】:2016-02-08 07:50:40
【问题描述】:

在实现自相关函数时,我有一个类似的术语

for k in range(start,N):
    c[k] = np.sum(f[:-k] * f[k:])/(N-k)

现在,如果 start = 1 一切正常,但我想很好地处理 0 开头的情况,没有条件。

显然它不起作用,因为 f[:-0] == f[:0] 并返回一个空数组,而在这种情况下我想要完整的数组。

【问题讨论】:

  • numpy 不是已经有自相关函数了吗?还是只有pandas
  • 它有一个我可以使用的correlate 函数,但自相关有不同的定义,特别是关于本术语中的(N-k) 分母。
  • 我认为 pandas 具有自相关性,您可以使用不同的术语作为分母,但我不确定了。
  • pandas.Series.autocorr docs不太清楚,我会查看代码

标签: python numpy slice


【解决方案1】:

在这种情况下不要使用负索引

f[:len(f)-k]

对于k == 0,它返回整个数组。对于任何其他积极的k,它等同于f[:-k]

【讨论】:

    【解决方案2】:

    如果 k 为零,则使用 None 作为切片,如下所示:

    for k in range(start,N):
        c[k] = np.sum(f[:-k if k else None] * f[k:])/(N-k)
    

    【讨论】:

    • 很高兴了解None,但我想完全避免分支,猜想@Wombatz 解决方案是最干净、最快的解决方案。
    • 速度上的差异可能会被程序的其他部分所淹没,因此请使用您认为最易读的惯用语。 (在我的测试中,速度差异只有几十纳秒的数量级)。
    • 嗯,你是对的,考虑到我正在处理的大型数据集,我认为不需要的 if 会很明显,但我刚刚测试过,实际上并非如此。可能它会被优化掉。我仍然更喜欢其他解决方案,只要我达到 15 分,就会给你一个 +1 :)
    【解决方案3】:

    有几种方法可以做到这一点,通过在应用公式之前测试k==0。由您决定唯一看起来更好的。

    for k in range(start,N):
        c[k] = np.sum(f[:-k] * f[k:])/(N-k) if k != 0 else np.sum(f * f[k:])/(N-k)
    
    for k in range(start,N):
        end_in_list = -k if k != 0 else None
        start_in_list = k
        c[k] = np.sum(f[:end_in_list] * f[start_in_list:])/(N-k)
    

    【讨论】:

      猜你喜欢
      • 2010-11-06
      • 2013-07-10
      • 2013-01-22
      • 1970-01-01
      • 2011-12-24
      • 2023-03-12
      • 2010-12-12
      • 1970-01-01
      • 2012-06-01
      相关资源
      最近更新 更多