平均位移

时间:2016-04-02 12:03:22

标签: python random-walk

我正在调查低密度等离子体中单个微米尺寸颗粒的运动。使用所谓的长距离显微镜,我记录了粒子的运动(2726幅图像,fps = 60 Hz)。

此处提供以mm为单位的x,y数据:http://pastebin.com/qdMsaUHD

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

enter image description here

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

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

如果有人能够向我展示完整的Python源代码(包含所有导入),我将非常感激,这是解决我的问题所必需的。

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

我从其中一个答案(Computing the mean square displacement of a 2d random walk in Python)尝试了以下内容,但代码产生了错误。

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()

2 个答案:

答案 0 :(得分:1)

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

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),然后应用以下definition

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

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

enter image description here

如果您想要修改/优化图形,可以在matplotlib上获得处理的好地方是教程部分here

答案 1 :(得分:0)

Numpy有一个标准函数来计算标准偏差。您可以使用s2功能。将列表作为输入,它将输出结果。你不需要编写这些循环就可以了。

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

请参阅here以获取示例。