繁体   English   中英

如何在 numpy 中有效地将 3D 矩阵与二维矩阵相乘

[英]How to multiply a 3D matrix with a 2D matrix efficiently in numpy

我有两个多维 arrays,我想将它们相乘。 一个形状为 N,N,3,另一个形状为 N,N。

让我设置舞台:

我有一个形状为N,3的原子位置数组:

atom_positions = [[x1,y1,z1],
                  [x2,y2,z2],
                  [x3,y3,z3],
                  ...       
                            ]

从这些我计算距离向量的上三角矩阵,以便生成的 N,N,3 矩阵包含atom_positions r_ij

pair_distance_vectors = [[[0,0,0],[x2-x1,y2-y1,z2-z1],[x3-x1,y3-y1,z3-z1],...],
                         [[0,0,0],[0,0,0]            ,[x3-x2,y3-y2,z3-z2],...],
                          ...
                                                                              ]

现在我想对这些对距离向量中的每一个进行归一化。 为此,我想使用我的 N,N pair_distances数组,其中包含pair_distance_vectors中每个向量的长度。 单个向量的公式为:r_ij/|r_ij|

我想通过进行矩阵乘法来做到这一点,其中 N,N 数组中的每个条目都变成一个标量,N,N,3 数组中的向量乘以该标量。 我很确定这可以通过使用numpy.dot()或不同的 function 以某种方式通过 numpy 实现,但我自己找不到答案。 另外,我担心如果我确实找到了允许这样做的转换,我的数学就会出错。

这是一些演示代码,它以非常低效的方式实现了我想要的:

import numpy as np

pair_distance_vectors = np.ones(shape=(2,2,3))
pair_distances = np.array(((1,2),(3,4)))
normalized_pair_distance_vectors  = np.zeros(shape=(2,2,3))

for i,vec_list in enumerate(pair_distance_vectors):
    for j,vec in enumerate(vec_list):
        normalized_pair_distance_vectors[i,j] = vec*pair_distances[i,j]

print(normalized_pair_distance_vectors)

提前致谢。

编辑:也许这更清楚:

distance_vectors = [[[x11,y11,z11],[x12,y12,z12],[x13,y13,z13],...],
                    [[x21,y21,z21],[x22,y22,z22],[x23,y23,z23],...],
                    ...                                            ]

distance_matrix = [[r_11,r_12,r_13,...],
                   [r_21,r_22,r_23,...],
                    ...                 ]

norm_distance_vectors = some_operation(distance_vectors,distance_matrix)

norm_distance_vectors = [[r_11*[x11,y11,z11],r_12*[x12,y12,z12],r_13*[x13,y13,z13],...],
                         [r_21*[x21,y21,z21],r_22*[x22,y22,z22],r_23*[x23,y23,z23],...],
                          ...                                                    ]

你不需要循环。 诀窍是通过重复m次来扩展您的pair_distance在第三维( m是向量的维度,这里是 3D),然后将两个 arrays 元素分开(适用于任何m维向量,将 3 替换为m ):

pair_distances = np.repeat(pair_distances[:,:,None], 3, axis=2)
normalized_pair_distance_vectors = np.nan_to_num(pair_distance_vectors/ pair_distances)

Output 用于您的示例输入:

[[[1.         1.         1.        ]
  [0.5        0.5        0.5       ]]

 [[0.33333333 0.33333333 0.33333333]
  [0.25       0.25       0.25      ]]]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM