Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.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 这两个numpy阵列之间的区别是什么?_Python_Numpy - Fatal编程技术网

Python 这两个numpy阵列之间的区别是什么?

Python 这两个numpy阵列之间的区别是什么?,python,numpy,Python,Numpy,我有一个形状为(N,d)的数组x 如果我按如下方式创建数组r_1和r_2,则输出应该相等,这是真的 import numpy as np N = 100 d = 2 x = np.random.rand(N, d) r_1 = x.reshape(N, 1, d) - np.repeat(x[np.newaxis, :, :], N, axis=0) r_2 = x.reshape(N, 1, d) - x.reshape(1, N, d) print((r_1 == r_2).all()

我有一个形状为(N,d)的数组
x

如果我按如下方式创建数组
r_1
r_2
,则输出应该相等,这是真的

import numpy as np

N = 100
d = 2
x = np.random.rand(N, d)

r_1 = x.reshape(N, 1, d) - np.repeat(x[np.newaxis, :, :], N, axis=0)
r_2 = x.reshape(N, 1, d) - x.reshape(1, N, d)

print((r_1 == r_2).all())
> True
但是,如果我在确定性模拟中使用数组,由于(我假设)浮点错误,这两种方法会产生不同的最终结果。 我对模拟做了一些深入研究,在第八次迭代之前,一切都是一样的,在第八次迭代中,我得到了如下差异:

Method 1: 0.4759682049387506
Method 2: 0.47596820493875036
这些浮点错误可能会传播到完全不同的模拟最终结果:

Method 1:
E_kin:  11651.935893586868
E_pot:  -22091.50550903025
Method 2:
E_kin:  12059.81250826829
E_pot:  -21037.60706699791
这两个数组之间的根本区别是什么,使用它们进行的计算结果并不相同?除了方法1或方法2是否用于计算
r
,模拟中的所有内容都保持不变


编辑:这是使用numpy版本1.18.1。

1。这些操作在数学上是否按预期工作?您正在删除不同形状的数组,虽然Python允许这样做,但结果可能不是预期的结果。2.您可以通过不同的方式获得不同的舍入误差,例如,求和顺序不同。如果您的算法作为一个整体对舍入错误如此敏感,那么您就有一些严重的稳定性问题。@petermisrimel 1。是的,它们按预期工作。我基本上想要
r[I,j]=x[I]-x[j]
,这两个广播操作都在做。我显式地减去不同形状的数组以利用numpy的广播。2.我知道求和排序之类的,但是这些数组的创建方式应该是每个条目只有一个减法运算。我同意稳定性问题,但这是我必须使用特定算法的家庭作业。这是一个分子动力学模拟,所以状态的任何分歧都会产生不同的物理现象,就我所知,这些阵列在各个方面都是相同的(数值、形状、步幅、旗帜等等)。您可以共享模拟的代码吗?您是否绝对确定它是确定性的,您是否通过在同一输入上重复运行它来测试它?即使是“数学上”确定的模拟,如果不小心实施,也可能是不确定的。特别是,一些BLAS库是非确定性的。@myrtlecat我确信它是确定性的,每种方法每次都产生相同的结果,唯一的随机部分是种子(位置和速度的初始化)。这是模拟类,这是我用来测试差异的文件。即,参见模拟类文件的第117行,以查看在测试文件的类实例化中设置
numpy_方法
kwarg之间的差异。