python-Np.cross产生错误的结果,寻找可行的替代方案
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-Np.cross产生错误的结果,寻找可行的替代方案,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1744字,纯文字阅读大概需要3分钟。
内容图文
![python-Np.cross产生错误的结果,寻找可行的替代方案](/upload/InfoBanner/zyjiaocheng/659/287ea393009d4b8d93e9662033073d3f.jpg)
我正在重新编写分子动力学时间序列的分析代码.由于必须分析大量的时间步长(每次模拟运行需要15万次),所以我的代码要尽可能快是非常重要的.
旧代码非常慢(实际上,与我的代码相比,它需要300到500倍的时间),因为它是为分析数千个PDB文件而编写的,而不是一堆充满不同模拟(大约60个)的模拟,每个模拟都有150000个时间步.我知道C或Fortran在这种情况下将是瑞士军刀,但是我在c方面的经验是…..
因此,我尝试为我的python代码使用尽可能多的numpy / scipy例程.因为我已经获得了使用mkl加快anaconda分发的许可证,所以这确实是一个很大的提高.
现在我正面临一个问题,希望我能以您理解我的意思的方式进行解释.
我有三个数组,每个数组的形状为(n,3,20).第一行是肽的所有残基,通常在23到31之间.第二行是xyz顺序的坐标,第三行是一些特定的时间步长.
现在,我正在计算每个时间步长上每个残差的扭力.我的形状为(n,3,1)的数组的代码如下:
def fast_torsion(d1, d2, d3):
tt = dot(d1, np.cross(d2, d3))
tb = dot(d1, d1) * dot(d2, d2)
torsion = np.zeros([len(d1), 1])
for i in xrange(len(d1)):
if tb[i] != 0:
torsion[i] = tt[i]/tb[i]
return torsion
现在,我尝试对具有扩展的第三轴的数组使用相同的代码,但与原始的慢速代码(使用for循环)相比,叉积函数会产生错误的值.
我在大型数组上尝试了此代码,它比for循环解决方案快10到20倍,比旧代码快200倍.
我正在尝试的是np.cross()仅计算第二个(xyz)轴上的叉积,并迭代其他两个轴上的叉积.在短轴的情况下,它可以很好地工作,而在大数组中,它只能在第一步中工作.我也尝试了轴设置,但是没有机会.
如果这是解决我的问题的唯一方法,我也可以使用Cython或numba.
附言对不起,我的英语,希望您能理解.
解决方法:
np.cross具有axisa,axisb和axisc关键字参数,用于选择输入和输出参数中要交叉相乘的向量的位置.我想您要使用:
np.cross(d2, d3, axisa=1, axisb=1, axisc=1)
如果不包括axisc = 1,则乘法结果将在输出数组的末尾.
另外,您可以通过执行以下操作来避免显式循环遍历扭转阵列:
torsion = np.zeros((len(d1), 1)
idx = (tb !=0)
torsion[idx] = tt[idx] / tb[idx]
内容总结
以上是互联网集市为您收集整理的python-Np.cross产生错误的结果,寻找可行的替代方案全部内容,希望文章能够帮你解决python-Np.cross产生错误的结果,寻找可行的替代方案所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。