【问题标题】:Python: Syntax appears to be exponentiating an array? Help me interpret?Python:语法似乎是对数组求幂?帮我解释一下?
【发布时间】:2016-10-31 08:19:20
【问题描述】:

我正在尝试破译一些复杂的代码。下面,我简化了我所理解的代码,以解决我的问题的核心。

scales = (2**arange(8, 12, .25)).astype(int)

在我看来,arange() 创建了一个值数组,范围从 8 到 11,值相隔 0.25。

但是2**arange 做了什么?我知道** 用于求幂,但对我来说可以对数组求幂是没有意义的!当然,对数组中的值取幂是有意义的。但这似乎是一种非常奇怪的语法!

【问题讨论】:

  • 从未听说过矢量化操作?如果您有一个数字数组,您可能希望对所有元素执行相同的操作。 some_array + 1 如何将1 添加到与2**some_array 不同的数组的所有元素中,2**some_array 将“指数”数组转换为2 的结果?
  • 以前肯定没听说过!但现在我有了,谢谢!

标签: python arrays numpy exponentiation


【解决方案1】:

Numpy 数组可让您将数值运算符应用于数组中的所有元素。所以array * 3 会将乘法应用于数组中的所有元素,生成一个带有结果的新数组。您可以在这样的表达式的任一侧使用数组;毕竟不是所有的运营商都是commutative

使用 2 ** array 只需将数组中的每个元素应用为 2 的指数,生成一个使用 2 ** <input item> 计算的数组:

>>> arange(8, 12, .25)
array([  8.  ,   8.25,   8.5 ,   8.75,   9.  ,   9.25,   9.5 ,   9.75,
        10.  ,  10.25,  10.5 ,  10.75,  11.  ,  11.25,  11.5 ,  11.75])
>>> 2**arange(8, 12, .25)
array([  256.        ,   304.43702144,   362.03867197,   430.53896461,
         512.        ,   608.87404288,   724.07734394,   861.07792922,
        1024.        ,  1217.74808576,  1448.15468787,  1722.15585844,
        2048.        ,  2435.49617153,  2896.30937574,  3444.31171688])

所以输入是一个数组,有88.258.5等,结果数组包含2 ** 82 ** 8.252 ** 8.5等的结果。

array.astype(int) 操作随后会降低结果:

>>> (2 ** arange(8, 12, .25)).astype(int)
array([ 256,  304,  362,  430,  512,  608,  724,  861, 1024, 1217, 1448,
       1722, 2048, 2435, 2896, 3444])

【讨论】:

    【解决方案2】:

    arange 返回一个numpy 数组,支持向量化操作。

    例如,2 ** [1 2 3] 返回 [2 4 8],就像 2 + [1 2 3] 返回 [3 4 5]

    【讨论】:

      【解决方案3】:

      Python 中的每种类型都可以实现methods that are the backing methods for various Python operators or operations。特别是在这种情况下,numpy.arange().__rpow__(int()) 由于运算符和操作数而被调用(分别是 **int().__pow__(numpy.arange()) 先前已返回 NotImplementedError)。这不仅允许定义对新类型的操作,还允许对不知道如何处理新类型操作数本身的现有类型进行定义。

      【讨论】:

        猜你喜欢
        • 2017-03-27
        • 2015-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多