我要问的问题可能有点奇怪。 我使用最新的Anaconda 3.5发行版进行计算。 我的所有惯例都主要基于numpy和pandas。
最近,我发现了Pandas / numpy / python的非常奇怪的行为(不知道谁负责)。
假设我有一个2 col(G, B
)Pandas DataFrame,没有索引(整数索引),由l
表示,以及以下函数:
import numpy as np
import pandas as pd
def runTest(l):
res = l.G + 1j * l.B
return res
两列都有float64
dtype。所以,我试图创建一个复数,其中实部取自G
,虚部取自B
。
奇怪的是:如果我们运行此代码,让我们说几百次,某些结果可能完全不同通常会出来。
我的数据示例:
def printDifference(y1, y2):
dif = np.absolute(y1 - y2) > 1e-13
ys1 = y1[dif]
ys2 = y2[dif]
for i in range(ys1.shape[0]):
print("{:d}: {:f} vs {:f}".format(i, ys1.iloc[i], ys2.iloc[i]))
main = runTest(l)
for i in range(200):
test = runTest(l)
if np.any(np.absolute(main - test) > 1e-10):
print(i)
printDifference(main, test)
break
149
0:0.000000 + 0.000093j vs 0.000000 + 0.000000j
1:0.000003 + 0.000132j vs 0.000006 + 0.000132j
2:0.000000 + 0.000006j vs 0.000000 + 0.000006j
3:0.000002 + 0.000113j vs 0.000005 + 0.000113j
4:0.000000 + 0.000009j vs 0.000000 + 0.000009j
5:0.000005 + 0.000210j vs 0.000009 + 0.000210j
6:0.000004 + 0.000161j vs 0.000007 + 0.000161j
7:0.000004 + 0.000160j vs 0.000007 + 0.000160j
8:0.000002 + 0.000095j vs 0.000004 + 0.000095j
9:0.000011 + 0.000448j vs 0.000022 + 0.000448j
...
1j * l.B
更改为1j * l.B.values
,则所有内容(统计上)都会正常。问题是:发生了什么?我在计算时读过Pandas和Numpy文档,但是没有找到可以解释这种行为的事情。
任何猜测都会受到高度赞赏!
P.s。如果需要,我可以提供准确的数据。但是我不确定我应该使用什么类型的骗子,所以提出请求,我会处理。
UPD
我成功复制了错误
l = pd.DataFrame({'G': np.random.rand(14000) * 1e-7, 'B': np.random.rand(14000) * 1e-5})