如果可能的话,把这个for循环变成一个向量函数的技巧

2024-04-27 23:04:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我想做的是使用矢量化操作来加速我的代码,如果这里有可能的话。例如,切片阵列可能更快。以下是我的代码片段:

def rotated_point(x,y,z):
    """
    Inputs:
        x,y,z:(old) original coordinates of atom
    Returns:
        x,y,z:(new) new coordinates of atom after rotation 
               about lower-left H-C bond
    """
    x_new = (((c4x*(v**2+w**2)-u*(c4y*v+c4z*w-u*x-v*y-w*z))*(1-cos(d))+
        L*x*cos(d)+sqrt(L)*(-c4z*v+c4y*w-w*y+v*z)*sin(d))/L)

    y_new = (((c4y*(u**2+w**2)-v*(c4x*u+c4z*w-u*x-v*y-w*z))*(1-cos(d))+
        L*y*cos(d)+sqrt(L)*(c4z*u-c4x*w+w*x-u*z)*sin(d))/L)

    z_new = (((c4z*(u**2+v**2)-w*(c4x*u+c4y*v-u*x-v*y-w*z))*(1-cos(d))+
        L*z*cos(d)+sqrt(L)*(-c4y*u+c4x*v-v*x+u*y)*sin(d))/L)
   return x_new, y_new, z_new

x = [c1x, c2x, c3x, c4x, c5x, c6x, h1x, h2x, h3x, h4x, h5x, h6x]
y = [c1y, c2y, c3y, c4y, c5y, c6y, h1y, h2y, h3y, h4y, h5y, h6y]
z = [c1z, c2z, c3z, c4z, c5z, c6z, h1z, h2z, h3z, h4z, h5z, h6z]
x_r = []
y_r = []
z_r = []

for i in range(len(x)):
    if (i==1 or i==3 or i==7 or i==9):
        x_r.append(x[i])
        y_r.append(y[i])
        z_r.append(z[i])
    else:
        x_new, y_new, z_new = rotated_point(x[i], y[i], z[i])
        x_r.append(x_new)
        y_r.append(y_new)
        z_r.append(z_new)

有没有办法把它变成向量函数


Tags: orof代码newsqrtsincospoint