大熊猫计算不一致

时间:2016-03-23 12:24:37

标签: python numpy pandas

我要问的问题可能有点奇怪。 我使用最新的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

     

...

  1. 请注意,它仅发生在 149 次迭代。
  2. 看起来真实部分被认为是两次,但虚构部分也有所不同。
  3. 如果我将1j * l.B更改为1j * l.B.values,则所有内容(统计上)都会正常。
  4. 问题是:发生了什么?我在计算时读过Pandas和Numpy文档,但是没有找到可以解释这种行为的事情。

    任何猜测都会受到高度赞赏!

    P.s。如果需要,我可以提供准确的数据。但是我不确定我应该使用什么类型的骗子,所以提出请求,我会处理。

    UPD 我成功复制了错误 l = pd.DataFrame({'G': np.random.rand(14000) * 1e-7, 'B': np.random.rand(14000) * 1e-5})

0 个答案:

没有答案