【问题标题】:Why is the inverse power of a int numpy array 0 despite "from __future__ import division"?尽管“来自 __future__ 导入除法”,为什么 int numpy 数组的逆幂为 0?
【发布时间】:2015-04-21 23:36:45
【问题描述】:

我总是使用from __future__ import division 来避免整数除法问题。我刚刚遇到了一个显然仍然存在的案例:

np.array([10])**(-1)

返回array([0]),与1/np.array([10])相反,后者按预期返回array([ 0.1])

我知道这可以解决,例如通过使用np.array([10])**(-1.) 或使用astype('float') 将数组转换为浮点数。我只是想知道它为什么会这样,因为它对我来说似乎有点不一致,例如10**(-1) 给出 0.1。

【问题讨论】:

    标签: python arrays numpy exponentiation


    【解决方案1】:

    作为上述答案的脚注,您可以通过检查相应通用函数的types 属性来检查 NumPy 将为特定输入数组类型返回什么。

    对于 NumPy 数组,幂运算符 ** 对应于 np.power

    >>> np.power.types
    ['bb->b', 'BB->B', 'hh->h', 'HH->H', 'ii->i', 'II->I', 'll->l', 'LL->L', 'qq->q', 
     'QQ->Q', 'ee->e', 'ff->f', 'dd->d', 'gg->g', 'FF->F', 'DD->D', 'GG->G', 'OO->O']
    

    Python 兼容的整数类型用l 表示,Python 兼容的浮点数用d (see here) 表示。

    可以看到,对于两种整数类型,** 将返回另一个整数:'ll->l'

    对于 NumPy 数组,除法运算符 / 对应于 np.divide

    >>> np.divide.types
    ['bb->d', 'BB->d', 'hh->d', 'HH->d', 'ii->d', 'II->d', 'll->d', 'LL->d', 'qq->d', 
     'QQ->d', 'ee->e', 'ff->f', 'dd->d', 'gg->g', 'FF->F', 'DD->D', 'GG->G', 'mq->m', 
     'md->m', 'mm->d', 'OO->O']
    

    这里,给定两个整数类型(以及大多数其他输入),将返回一个浮点数:'ll->d'

    【讨论】:

      【解决方案2】:

      numpy.array() 使用运算符重载来实现功能。例如,**object.__pow__() special method 处理。

      / 运算符通常由object.__div__ 处理(以及用于右侧值的__rdiv__ 方法),from __future__ import division 'switch' 导致 Python 使用object.__truediv__ 方法代替。

      但是,** 运算符不受开关的影响; Python 将继续调用object.__pow__,而numpy 不会知道您使用了__future__ 导入。

      因此,当你给它整数操作数时,它会继续返回整数结果;即使那样它也不会强制到float

      请注意,Python 也提供了 地板除法 运算符,形式为 // operator__floordiv__ hook。没有这样的求幂等价物,所以numpy 没有其他选项可以区分使用floatint 操作数。

      【讨论】:

      • 好吧,这是有道理的。也许对我来说更令人困惑的是 10**(-1) 似乎总是使用浮点除法,即使没有“来自未来的导入除法”
      • @jacob:见** power operator documentation;在 Python 中使用整数指数 used 来引发异常。在这些情况下,强制浮动被认为更有帮助。我猜 Numpy 在这里做出了不同的选择,因为它们的用例不同(不同的程序员受众)。
      猜你喜欢
      • 1970-01-01
      • 2021-07-08
      • 2011-06-08
      • 2021-11-17
      相关资源
      最近更新 更多