Python 根据excel文件中的数据计算/绘制三维单个粒子的均方位移

Python 根据excel文件中的数据计算/绘制三维单个粒子的均方位移,python,Python,我试图用python计算并绘制单个粒子在3d中的均方位移(MSD)。在我的excel文件中,在第2-29行的x、y和z的单独列中有值。如何计算MSD 我最初尝试下面列出的代码,直到行“MSD=np.mean(diff_sq)”,但当我尝试绘制MSD与时间的关系图时,我看到一个错误,表示第一个维度不相同。这是因为MSD输出的是单个值,而不是某种类型的数组,因此无法将两者一起绘制 xdata = xl['x '][0:27] ydata = xl['y'][0:27] zdata = xl['z']

我试图用python计算并绘制单个粒子在3d中的均方位移(MSD)。在我的excel文件中,在第2-29行的x、y和z的单独列中有值。如何计算MSD

我最初尝试下面列出的代码,直到行“MSD=np.mean(diff_sq)”,但当我尝试绘制MSD与时间的关系图时,我看到一个错误,表示第一个维度不相同。这是因为MSD输出的是单个值,而不是某种类型的数组,因此无法将两者一起绘制

xdata = xl['x '][0:27]
ydata = xl['y'][0:27]
zdata = xl['z'][0:27]

import numpy as np
r = (xdata**2 + ydata**2+zdata**2)**0.5
diff = np.diff(r) 
diff_sq = diff**2
MSD = np.mean(diff_sq)
for i in range(28): 

我需要以增量计算MSD,所以我试图编写一个for循环来帮助实现这一点。但是,我陷入了for循环,因为我不太确定如何在excel文件中为我的数据编写for循环。

您可以使用列表理解创建MSDs列表。我们将创建一个越来越大的
diff
片段的平均值列表。因此,第一个条目将是第一个列表项的平均值,第二个条目将是前两个列表项的平均值,以此类推

xdata = xl['x'][0:28]
ydata = xl['y'][0:28]
zdata = xl['z'][0:28]

import numpy as np
r = (xdata**2 + ydata**2+zdata**2)**0.5
diff = np.diff(r) 
diff_sq = diff**2
MSD = [np.mean(diff_sq[0:i]) for i in range(1, 29)]

另请注意:我将切片索引从
[0:27]
更改为
[0:28]
,因为它将排除最后一个索引。要从列表中获取前27个项目,需要在长度+1处切片。

好的,那么您要计算27个坐标中每个坐标的MSD,对吗?因此,您将得到一个包含27个MSD的数组或列表?行
MSD=np.mean(diff_sq)
正在计算包含27个元素的数组的平均值,因此返回一个平均值作为结果。这可能会给您的客户带来问题you@Ahndwoo是的,没错。然后,一旦我有了27个MSDs的列表/数组,我就可以用我的27个时间值来绘制它。谢谢!我现在看到了一个情节,但它没有给我我想要的相关性。我检查了我的数据,但代码是有意义的,应该会产生线性关联(当轴限制调整时)。你对我的问题有什么建议吗?它看起来像是一个反函数的图,而不是一个对数图(或者是一个水平渐近线的图)。