Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么当x在numpy中增加时,2提升到x会给出负值?_Python_Algorithm_Numpy_Complexity Theory - Fatal编程技术网

Python 为什么当x在numpy中增加时,2提升到x会给出负值?

Python 为什么当x在numpy中增加时,2提升到x会给出负值?,python,algorithm,numpy,complexity-theory,Python,Algorithm,Numpy,Complexity Theory,Numpy给出了一个数组,该数组包含提升为自然数的2的列表作为负值。如何将2提升为正数,如1000,则为负数 我有一个数组“x”,我们用它来绘制从1到n的x轴值。 对于数组x中的每个值,我们取x**(2**x),即x提升到(2提升到x),并将其用作y轴值 案例1:x∈ [1,50) 我使用了下面的代码,输出是正确的,因为np.power(2,x)的输出中没有负值 输出: 案例2:x∈ [1100) 我使用了下面的代码,并且在np.power(2,x)和np.power(x,np.power(

Numpy给出了一个数组,该数组包含提升为自然数的2的列表作为负值。如何将2提升为正数,如1000,则为负数

我有一个数组“x”,我们用它来绘制从1到n的x轴值。 对于数组x中的每个值,我们取x**(2**x),即x提升到(2提升到x),并将其用作y轴值

案例1:x∈ [1,50)

我使用了下面的代码,输出是正确的,因为np.power(2,x)的输出中没有负值

输出:

案例2:x∈ [1100)

我使用了下面的代码,并且在np.power(2,x)和np.power(x,np.power(2,x))的输出中有负值

输出:


如果x始终为正且不递减,而2为常数且为正,那么为什么2会被提升为正数,并在numpy中获得负输出?

整数可能溢出。32位整数只能包含高达~2.1b的值,如果溢出,则会卷回负数


设置
dtype=int64
可能会解决您的问题。否则,只需使用python整数(
dtype=object
)。它们效率不高,但可以容纳内存允许的尽可能多的数据。

您应该使用python的power运算符(**)出于您的目的,当大小超过64位时,即使将numpy dtype更改为int64也无济于事。而Python的power运算符足以满足您的目的

x**(2**x)

您可能要询问3个案例

案例1:您只关心最重要的数字 使用浮动。将所有内容都转换为双精度浮动,最高可达10300左右

如果超过了这个值,只存储数字的对数,并使用相应的数学(加法日志=乘法,乘法日志=指数),那么你就可以得到高得离谱的数字

>>> math.log(3) * 50
54.93061443340549
>>> math.log(3) * 50 == math.log(3 ** 50) == math.log(717897987691852588770249)
True
案例2:您只关心最低有效数字 我认为这被称为“有限域”或“伽罗瓦”数学?通常在密码学和其他方面很有用。不幸的是,Numpy似乎没有幂/模函数,所以你需要滚动你自己的or(那里的or只有在单个运算中没有溢出时才起作用,因此可能不会再次起作用)

案例3:你需要所有的数字 您必须使用'bigint'数学,Numpy没有提供。Python整数是很容易的选择

>>> 3 ** np.array([2, 10, 50, 100], dtype=np.object)
array([9, 59049, 717897987691852588770249,
       515377520732011331036461129765621272702107522001], dtype=object)

这听起来像是简单的整数溢出和换行。您的输出不在发布中;所讨论的值与标准的MAXINT值相比如何?
np.int32(2)**np.int32(31)
→ -2147483648.
np.int64(2)**np.int64(63)
→ -9223372036854775808偶数
np.int64
并不能解决所有问题:
np.int64(9801)**np.int64(99)-8755237408081528679
这是一个已知的问题,即使使用x**(2**x)和dtype=np.int64是否尝试过dtype=object?即使使用x**(2**x)也会发生溢出或者dtype=np.int64。虽然dtype=object确实可以获得更高幂的正值,但它在numpy中的运行速度非常慢,代码会冻结。Python整数速度较慢,但如果您计算的值高于2^63,则它们是唯一的选项。
>>> 3 ** np.array([2, 10, 50, 100], dtype=np.float)
array([9.00000000e+00, 5.90490000e+04, 7.17897988e+23, 5.15377521e+47])
>>> math.log(3) * 50
54.93061443340549
>>> math.log(3) * 50 == math.log(3 ** 50) == math.log(717897987691852588770249)
True
>>> [pow(3, n, 2 ** 16 + 1) for n in [2, 10, 50, 100]]  # modulo some random prime
[9, 59049, 12911, 33330]
>>> 3 ** np.array([2, 10, 50, 100], dtype=np.object)
array([9, 59049, 717897987691852588770249,
       515377520732011331036461129765621272702107522001], dtype=object)