我正在模拟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))
Run Code Online (Sandbox Code Playgroud)
它不适用于否定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.
Run Code Online (Sandbox Code Playgroud)
为什么?x^-1应该只是1/x如果我正确地回忆起我的数学.
use*_*ica 14
在NumPy中,用于选择操作的输出a_range ** sdtype 的逻辑基于dtypes,而不是值.这意味着必须a_range ** -2具有相同的输出dtype a_range ** 2.
重要的是numpy.array([2]) ** 2给出整数输出,这意味着numpy.array([2]) ** -2必须给出整数或什么都不给.他们什么都没挑 将整数提升为负整数幂是NumPy中的错误.
如果需要浮点输出,请进行浮点输入:
a_range = np.arange(2, n + 1, dtype=float)
Run Code Online (Sandbox Code Playgroud)
要么
a_range = np.arange(2, n + 1).astype(float)
Run Code Online (Sandbox Code Playgroud)
NumPy的类型规则有一些奇怪的方面,你可能不会从上面的描述中得到.一个是对于涉及标量和数组的操作,在使用输入dtypes选择结果dtype之前,标量的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')
Run Code Online (Sandbox Code Playgroud)
这里,标量numpy.int32(1)被"降级"为int8,但数组不会被降级.(它实际上比降级到int8要复杂一些,特别是对于有符号/无符号处理;请参阅实现以获取完整的详细信息.)
其次,当涉及到uint64s时,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 ])
Run Code Online (Sandbox Code Playgroud)
这是因为NumPy找不到足够大的uint64值和负值的整数dtype,因此它放弃并强制浮点数的输入.只要你避免使用标量类型"demotion",就可以看到带有符号dtype的正指数也是如此:
>>> numpy.arange(5, dtype='uint64') ** numpy.array([2], dtype='int32')
array([ 0., 1., 4., 9., 16.])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10301 次 |
| 最近记录: |