我正在模拟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
。
答案 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值。