python - 为什么 numpy.arange() 和 range() 生成的相同数字的(复)函数不同?

标签 python python-3.x numpy list-comprehension fibonacci

# necessary imports
import numpy as np
import matplotlib.pyplot as plt

可重现的设置

比奈公式如下,来自here :

enter image description here

让我们在 python 中定义这个函数:

def binet(n):
    phi = (1 + 5 ** 0.5) / 2
    return ((phi**n) - (-1/phi)**n) / (5**0.5)

对于 phi 值,我使用 this .


什么有效

让我们计算 binet(n),其中 n=[0.1,0.2,0.3,0.4,0.5,...,4.9,5.0]:

[binet(x/10) for x in range(1,51)]

让我们绘制它:

# our results
plt.plot([n.real for n in binetn],[n.imag for n in binetn])
# classic fibonacci numbers
plt.scatter([1,1,3,5],[0,0,0,0],c='r')

enter image description here

看起来不错,同意this以及我们的数学知识。


什么不起作用

基于上述内容,我相信这也会起作用:

binetn=[binet(x) for x in np.arange(0.1,5.1,0.1)]

然而事实并非如此。 binetn 变为:

[nan,nan,nan,nan,nan,nan,nan,nan,nan,1.0,...,nan,nan,5.000000000000001]

即,除非 binet(n) 为实数,否则它是 nan

它还给出警告:

/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:2: RuntimeWarning: invalid value encountered in double_scalars


问题

为什么我可以循环遍历 range() 生成的数字列表并获得复杂的结果,而我不能使用 np.arange() 执行相同的操作>?

最佳答案

重复的重点是np.arange。但这不是这里的问题。

比较将 float 传递给 binetnp.float64:

In [52]: binet(0.1)                                                                                  
Out[52]: (0.06391735396852471-0.13170388861716523j)
In [53]: binet(np.float64(0.1))                                                                      
/usr/local/bin/ipython3:3: RuntimeWarning: invalid value encountered in double_scalars
  # -*- coding: utf-8 -*-
Out[53]: nan

或这些迭代:

In [54]: [binet(float(x)) for x in np.arange(0.1, 5.1, 0.1)];                                        
In [55]: [binet(x) for x in np.arange(0.1, 5.1, 0.1).tolist()];                                      
In [56]: [binet(x) for x in np.arange(0.1, 5.1, 0.1)];                                               
/usr/local/bin/ipython3:3: RuntimeWarning: invalid value encountered in double_scalars
  # -*- coding: utf-8 -*-

进一步挖掘,它似乎与复杂有关。如果 numpy 参数很复杂,则计算可以:

In [58]: binet(np.complex(.1))                                                                       
Out[58]: (0.06391735396852471-0.13170388861716523j)
In [59]: [binet(x) for x in np.arange(0.1, 5.1, 0.1).astype(complex)]; 

事实上我们不需要迭代。复杂的数组工作得很好:

In [60]: x = np.arange(0.1, 5.1, 0.1).astype(complex)                                                
In [61]: binet(x)                                                                                    
Out[61]: 
array([0.06391735-1.31703889e-01j, 0.16378803-2.38746028e-01j,
       0.28913834-3.13167258e-01j, 0.42813892-3.50853867e-01j,
       0.56886448-3.51577584e-01j, 0.70044744-3.18660871e-01j,
       0.81402504-2.58333837e-01j, 0.9034083 -1.78872498e-01j,
       ...
       4.32034432-3.76903988e-02j, 4.54051382-2.60971457e-02j,
       4.76690299-1.30754885e-02j, 5.        +0.00000000e+00j])

关于python - 为什么 numpy.arange() 和 range() 生成的相同数字的(复)函数不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63569585/

相关文章:

python - Flask 中的蓝图

Python和Azure cli备份命令: is misspelled or not recognized by the system

python - 未在 except block 中捕获错误

python - discord bot autorole——在 _run_event yield from getattr(self, event)(*args, **kwargs)

python - Python 3 中的 __total__ dunder 属性是什么意思?

python - 通过 Needleman Wunsch 表进行回溯

文件或无的 Python 上下文

python - 根据向量类型元素获取numpy数组的掩码

Python 不能将序列乘以 'float' 类型的非整数

python - 如何检测一个二维数组是否在另一个二维数组中?