- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是对社区的呼吁,看看是否有人有提高此 MSD 计算实现速度的想法。它主要基于此博客文章中的实现:http://damcb.com/mean-square-disp.html
目前,对于 5000 点的 2D 轨迹,当前的实现需要大约 9 秒。如果你需要计算很多轨迹,那真的太多了......
我没有尝试将它并行化(使用 multiprocess
或 joblib
),但我觉得创建新进程对于这种算法来说太重了。
这是代码:
import os
import matplotlib
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# Parameters
N = 5000
max_time = 100
dt = max_time / N
# Generate 2D brownian motion
t = np.linspace(0, max_time, N)
xy = np.cumsum(np.random.choice([-1, 0, 1], size=(N, 2)), axis=0)
traj = pd.DataFrame({'t': t, 'x': xy[:,0], 'y': xy[:,1]})
print(traj.head())
# Draw motion
ax = traj.plot(x='x', y='y', alpha=0.6, legend=False)
# Set limits
ax.set_xlim(traj['x'].min(), traj['x'].max())
ax.set_ylim(traj['y'].min(), traj['y'].max())
t x y
0 0.000000 -1 -1
1 0.020004 -1 0
2 0.040008 -1 -1
3 0.060012 -2 -2
4 0.080016 -2 -2
def compute_msd(trajectory, t_step, coords=['x', 'y']):
tau = trajectory['t'].copy()
shifts = np.floor(tau / t_step).astype(np.int)
msds = np.zeros(shifts.size)
msds_std = np.zeros(shifts.size)
for i, shift in enumerate(shifts):
diffs = trajectory[coords] - trajectory[coords].shift(-shift)
sqdist = np.square(diffs).sum(axis=1)
msds[i] = sqdist.mean()
msds_std[i] = sqdist.std()
msds = pd.DataFrame({'msds': msds, 'tau': tau, 'msds_std': msds_std})
return msds
# Compute MSD
msd = compute_msd(traj, t_step=dt, coords=['x', 'y'])
print(msd.head())
# Plot MSD
ax = msd.plot(x="tau", y="msds", logx=True, logy=True, legend=False)
ax.fill_between(msd['tau'], msd['msds'] - msd['msds_std'], msd['msds'] + msd['msds_std'], alpha=0.2)
msds msds_std tau
0 0.000000 0.000000 0.000000
1 1.316463 0.668169 0.020004
2 2.607243 2.078604 0.040008
3 3.891935 3.368651 0.060012
4 5.200761 4.685497 0.080016
%timeit msd = compute_msd(traj, t_step=dt, coords=['x', 'y'])
1 loops, best of 3: 8.53 s per loop
最佳答案
它逐行进行了一些分析,看来 Pandas 正在使这一点变慢。这个纯 numpy 版本快了大约 14 倍:
def compute_msd_np(xy, t, t_step):
shifts = np.floor(t / t_step).astype(np.int)
msds = np.zeros(shifts.size)
msds_std = np.zeros(shifts.size)
for i, shift in enumerate(shifts):
diffs = xy[:-shift if shift else None] - xy[shift:]
sqdist = np.square(diffs).sum(axis=1)
msds[i] = sqdist.mean()
msds_std[i] = sqdist.std(ddof=1)
msds = pd.DataFrame({'msds': msds, 'tau': t, 'msds_std': msds_std})
return msds
关于python-3.x - 在 Python 中加速 MSD 计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32988269/
我正在阅读 Cormen 等人的《算法导论》。阿尔。在他们描述基数排序的部分,他们说: Intuitively you might sort numbers on their most signifi
尝试在Swift中实现一个MSD版本的radix版本 func sort(_ array: [Int]) -> [Int]{ var arr = array let base = 10
这是面向生物学家的 matlab 入门类(class)的一部分。我的数据点(对于单个粒子!)在一个具有 4 列(时间、x、y、z)和几千行的矩阵中。我想要做的是使用所有时间步长的 xyz 坐标计算粒子
我不确定为什么有人会使用 LSD 基数排序。 默沙东的优势: 它可以处理可变长度的字符串 它并不总是需要扫描整个字符串(它可以更快地决定顺序) 可以使用插入排序来规避计数排序的缺点。 最佳答案 LSD
感谢阅读这篇文章。 我想创建一个 MSD 基数排序,它应该按字典(字母)顺序对无符号整数 vector 进行排序。 给定“1、3、32、1254、3、165、50000、11、213” 排序为“1、1
本书"Introduction to Algorithms"提到基数排序的 LSD(最低有效数字)版本。然而,正如其他人在 stackoverflow 中指出的那样,也存在 MSD(最高有效数字)版本
MSDN声明以下语法: RAISERROR ( { msg_id | msg_str | @local_variable } { ,severity ,state } [ ,argument [
我正在做一个最多 8 位数字的数字,但我不知道如何仅使用循环来制作表格。所以如果数字是 12345678 它应该垂直显示12345678 这就是我所拥有的,它的工作原理是我只想使用列而不是 print
这是对社区的呼吁,看看是否有人有提高此 MSD 计算实现速度的想法。它主要基于此博客文章中的实现:http://damcb.com/mean-square-disp.html 目前,对于 5000 点
我真的很困惑the "in-place" MSD radix sort算法: Each bin is then processed recursively using the next digit,
我是一名优秀的程序员,十分优秀!