【问题标题】:python numpy slice notation (COMMA VS STANDARD INDEX)python numpy 切片表示法(COMMA VS STANDARD INDEX)
【发布时间】:2016-02-26 06:18:15
【问题描述】:

使用逗号和为可能更传统的读者显式展开索引引用之间是否存在性能差异?由于两者似乎产生相同的结果,但后者可能对某些人来说更直观

x = numpy.array([[1,2,3,4],
                 [5,6,7,8]])

comma_method = x[0,1:3] 
>>> numpy.array([2,3])

conventional method = x[0][1:3]
>>> numpy.array([2,3])

【问题讨论】:

    标签: python numpy slice comma notation


    【解决方案1】:

    几乎总是使用逗号,不是出于性能原因,而是因为索引两次并不完全等效:

    In [2]: x = numpy.array([[0, 1], [2, 3]])
    
    In [3]: x[:1, :1]
    Out[3]: array([[0]])
    
    In [4]: x[:1][:1]
    Out[4]: array([[0, 1]])
    

    也就是说,逗号似乎也有速度优势:

    In [7]: %timeit x[0][0]
    The slowest run took 25.41 times longer than the fastest. This could mean that a
    n intermediate result is being cached 
    1000000 loops, best of 3: 357 ns per loop
    
    In [8]: %timeit x[0, 0]
    The slowest run took 41.92 times longer than the fastest. This could mean that a
    n intermediate result is being cached 
    1000000 loops, best of 3: 148 ns per loop
    

    我不确定最慢的运行和最快的运行有这样的时间差是怎么回事。

    【讨论】:

    • 是否有一个文档链接详细说明了您之前提到的逗号和索引两次之间的区别?谷歌搜索comma vs indexes 并不是最具有描述性的解决方案
    • @AlanL:我不知道描述它的文档页面,但这是基本索引规则的直接结果。在x[:1, :1] 中,索引表达式表示沿x 的第一轴和第二轴进行切片。相反,x[:1][:1] 表示沿x 的第一个轴切片,然后沿结果的第一个轴切片。
    【解决方案2】:

    第二种情况效率较低,因为在随后索引的第一个索引之后创建了一个新的临时数组。

    【讨论】:

      猜你喜欢
      • 2019-03-06
      • 2012-08-23
      • 1970-01-01
      • 2020-12-11
      • 2011-08-30
      • 2016-08-05
      • 2017-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多