为什么我不能在numpy中提升到负面的力量?

时间:2017-04-07 21:26:12

标签: python numpy

我正在模拟Riemann theta函数:

import numpy as np
def theta(s, n=100):
    a_range = np.arange(2, n + 1)
    return 1 + sum(1/(a_range ** s))

它不适用于否定s;例如theta(-2)会导致此错误:

      1 def theta(s, n=100):
      2     a_range = np.arange(1)
----> 3     return 1 + sum(1/(a_range ** s))
      4 
      5 theta(-2)

      ValueError: Integers to negative integer powers are not allowed.

为什么?如果我正确地回忆起我的数学,x^-1应该是1/x

2 个答案:

答案 0 :(得分:13)

在NumPy中,用于选择a_range ** s等操作的输出dtype的逻辑基于dtypes,而不是值。这意味着a_range ** -2必须与a_range ** 2具有相同的输出dtype。

numpy.array([2]) ** 2这样的东西给出整数输出是很重要的,这意味着numpy.array([2]) ** -2必须给出整数或什么都不给。他们什么都没挑将整数提升为负整数幂是NumPy中的一个错误。

如果想要浮点输出,请进行浮点输入:

a_range = np.arange(2, n + 1, dtype=float)

a_range = np.arange(2, n + 1).astype(float)

NumPy的类型规则有一些奇怪的方面,你可能不会从上面的描述中得到。一个是对于涉及标量和数组的操作,标量的dtype may actually be "demoted"基于输入dtypes之前的值来选择结果dtype:

>>> (numpy.array([1], dtype='int8') + numpy.int32(1)).dtype
dtype('int8')
>>> (numpy.array([1], dtype='int8') + numpy.array([1], dtype='int32')).dtype
dtype('int32')

这里,标量numpy.int32(1)被“降级”为int8,但数组不会被降级。 (它实际上比降级到int8要复杂一些,特别是对于有符号/无符号处理;有关详细信息,请参阅implementation。)

其次,当涉及到uint64时,NumPy可能会突然出现负面指数:

>>> numpy.arange(5, dtype='uint64') ** -2
__main__:1: RuntimeWarning: divide by zero encountered in power
array([       inf, 1.        , 0.25      , 0.11111111, 0.0625    ])

这是因为NumPy找不到足够大的uint64值和负值的整数dtype,因此它放弃并强制浮点数的输入。只要你避免使用标量类型“降级”,就可以看到带有符号dtype的正指数也是如此:

>>> numpy.arange(5, dtype='uint64') ** numpy.array([2], dtype='int32')
array([ 0.,  1.,  4.,  9., 16.])

答案 1 :(得分:0)

我要解决的问题是-

float_value = float(input_value)
power_value = float_value**-power
final_value = int(power_value)

在这里,input_value是输入数字,将其转换为浮点数,然后计算负功率,然后取其int值。