python - 使用 numpy 处理点矩阵乘法组

标签 python arrays numpy matrix

给定两个平行数组,一个是旋转矩阵数组,另一个是一组 3D 点数组,我正在寻找将每个子组与其对应矩阵相乘的最快方法。

我能够通过使用 numpy.einsum 遍历每个组来实现我想要的。我希望有一种方法可以在没有循环的情况下做到这一点。这是我到目前为止的代码:

import numpy as np
N_GROUPS = 10
N_SUBGROUPS = 4

p = np.random.random((N_SUBGROUPS,N_GROUPS,3,)) # N_GROUPS of N_SUBGROUPS of 3D points
M = np.random.random((N_GROUPS,3,3,))           # N_GROUPS of rotation matrices
I = np.linalg.inv(M)                            # Inverse of M for testing purposes

# Use a loop to transform every subgroup.
for i in xrange(N_SUBGROUPS):
    p_ = np.einsum('ij,ijk->ik', p[i], M)

    # test
    p__= np.einsum('ij,ijk->ik', p_, I)
    print np.allclose(p[i],p__)# Returns True

重写 einsum 表达式以处理我的情况的任何帮助,或有关如何使用其他方法的建议将不胜感激。

最佳答案

这真的很简单:您自己完成了大部分工作!

只需取与子组对应的索引并将其放在 einsum 方程的两边:这将为您提供所需的维度数组 (N_SUBGROUPS, N_GROUPS, 3)

假设我们称子群索引为l,那么:

p_ = np.einsum('lij,ijk->lik', p, M)

# I've changed the subgroup range index for clarity
for l in range(N_SUBGROUPS):
    # test
    p__= np.einsum('ij,ijk->ik', p_[l], I)
    print(np.allclose(p[l],p__))  # Returns True

关于python - 使用 numpy 处理点矩阵乘法组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38579358/

相关文章:

python - TypeError: * 之后的 function() 参数必须是一个序列,而不是生成器

python - 保存带有混合数据的 numpy 数组

python - 如何在 TensorFlow 中使用 tf.get_variable 和 numpy 值初始化变量?

python - 如何让 POS n-gram 更有效?

python - Scapy 变量嗅探器

arrays - 对数组中的项目执行操作 - VBA

java - 多维数组列表配对

java - Android 程序因空指针异常而崩溃

python - 二分法的网格应用

python - API 端点的 Django 子域配置