为什么 numpy.arange() 和 range() 生成的相同数字的(复杂)函数不同?
Why do (complex) functions of the same numbers generated by numpy.arange() and range() differ?
# necessary imports
import numpy as np
import matplotlib.pyplot as plt
可重现的设置
比奈公式如下,来自here:
让我们在python中定义这个函数:
def binet(n):
phi = (1 + 5 ** 0.5) / 2
return ((phi**n) - (-1/phi)**n) / (5**0.5)
对于 phi
值,我使用了 this。
什么有效
让我们为 n=[0.1,0.2,0.3,0.4,0.5,...,4.9,5.0]
计算 binet(n)
:
[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')
看起来不错,同意 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]
即 nan
除非 binet(n)
是真实的。
同时给出警告:
/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:2:
RuntimeWarning: invalid value encountered in double_scalars
问题
为什么我可以遍历 range()
生成的数字列表并得到复杂的结果,而我不能用 np.arange()
做同样的事情?
副本集中在 np.arange
。但这不是这里的问题。
比较将浮点数传递给 binet
与传递给 np.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 -*-
进一步挖掘,它似乎与 complex
有关。如果numpy
参数是复数,计算就ok了:
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])
# necessary imports
import numpy as np
import matplotlib.pyplot as plt
可重现的设置
比奈公式如下,来自here:
让我们在python中定义这个函数:
def binet(n):
phi = (1 + 5 ** 0.5) / 2
return ((phi**n) - (-1/phi)**n) / (5**0.5)
对于 phi
值,我使用了 this。
什么有效
让我们为 n=[0.1,0.2,0.3,0.4,0.5,...,4.9,5.0]
计算 binet(n)
:
[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')
看起来不错,同意 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]
即 nan
除非 binet(n)
是真实的。
同时给出警告:
/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:2: RuntimeWarning: invalid value encountered in double_scalars
问题
为什么我可以遍历 range()
生成的数字列表并得到复杂的结果,而我不能用 np.arange()
做同样的事情?
副本集中在 np.arange
。但这不是这里的问题。
比较将浮点数传递给 binet
与传递给 np.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 -*-
进一步挖掘,它似乎与 complex
有关。如果numpy
参数是复数,计算就ok了:
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])