0

我正在研究低密度等离子体中单个微米大小的粒子的运动。我用所谓的长距离显微镜记录了粒子的运动(2726 张图像,fps=60 Hz)。

以 mm 为单位的 x,y 数据可在此处获得:http: //pastebin.com/qdMsaUHD

使用mathematica,我得到以下均方位移(MSD)的对数图:

在此处输入图像描述

我是 Python 新手,并搜索了有关如何从文件中读取 2D 坐标、计算和显示 MSD(均值和标准差)的示例。

我已经看到有一些答案显示了如何计算 MSD,但我无法使它们适应我的数据。

如果有人可以向我展示解决我的问题所必需的完整 Python 源代码(包含所有导入),我将不胜感激。

这对我来说将是一个很好的机会,也是一个非常具体的问题,可以开始使用 Python 进行编程。非常感谢您的帮助。

我从答案之一(计算 Python 中 2d 随机游走的均方位移)中尝试了以下内容,但代码产生了错误。

import numpy as np
import matplotlib.pyplot as plt

data= [[49.136926889715, 48.4423791821561],
[48.8104534783146, 51.0491783022365],
[48.5231487166892, 53.3485202014],
[48.2320069851565, 55.2569539728078],
[47.8817794028032, 56.993296770262],
[47.381875792142, 58.179721166033],
...
[45.3409434914228, 49.0259838546922]]

def compute_MSD(path):
   totalsize=len(path)
   msd=[]
   for i in range(totalsize-1):
       j=i+1
       msd.append(np.sum((path[0:-j]-path[j::])**2)/float(totalsize-j))

   msd=np.array(msd)
   return msd

result=compute_MSD(data)

plt.plot(result)
plt.show()
4

2 回答 2

2

我的图表看起来与您的略有不同,这可能源于对您正在计算的确切内容的误解,但我相信这解决了基本想法。

plasma = [[0.09296720430107527, 0.09280376344086022],
[0.09230113636363636, 0.09769886363636364],
[0.09130555555555556, 0.10198777777777777],
...

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df = pd.DataFrame(plasma, columns=['x', 'y'])
df['time'] = np.arange(0,len(df)) / 60.0
df['dist'] = np.sqrt(df['x']**2 + df['y']**2)
df['MSD'] = pd.rolling_mean((np.abs(df['dist'])**2), len(df), min_periods=1)

以上是我对你所说的 MSD 的解释。我正在使用距原点的距离,即sqrt(x^2 + y^2)然后应用以下定义

然后您可以使用matplotlib创建一个绘图,如下所示

plt.loglog(df['time'], df['MSD'], 'o')
plt.xlabel('t (sec)')
plt.ylabel('MSD')
plt.show()

在此处输入图像描述

如果您想润色/细化图表,这里是教程部分,一个很好的处理 matplotlib 的地方。

于 2016-04-02T13:13:29.200 回答
0

Numpy 有一个标准函数来计算标准偏差。你可以使用numpy.std函数。将列表作为输入,它将输出结果。您无需编写这些循环即可。

ddof = 1获得与函数参数中设置的 MATLAB 相同的结果numpy.std

有关示例,请参阅此处

于 2016-04-02T12:44:49.863 回答