Python: 语法似乎是对数组求幂?帮我解释一下?

Python: Syntax appears to be exponentiating an array? Help me interpret?

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

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

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

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

arange returns一个numpy数组,支持向量化运算

例如2 ** [1 2 3]returns[2 4 8],就像2 + [1 2 3]returns[3 4 5].

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 ** 8、[=19]的结果=]、2 ** 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])

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