Python在向量上计算特定的内积

时间:2016-09-30 07:17:26

标签: python numpy vector vectorization

假设具有m x 6,n x 6

的两个向量
import numpy as np
a = np.random.random(m,6)
b = np.random.random(n,6)

使用np.inner按预期工作并产生

np.inner(a,b).shape
(m,n)

每个元素都是每个组合的标量积。我现在想要计算一种特殊的内在产品(即Plucker)。现在我正在使用

def pluckerSide(a,b):
    a0,a1,a2,a3,a4,a5 = a
    b0,b1,b2,b3,b4,b5 = b
    return a0*b4+a1*b5+a2*b3+a4*b0+a5*b1+a3*b2

a,b由for循环切片。这太慢了。任何有关矢量化的计划都会失败主要是由于形状错误导致的广播错误。不能让np.vectorize工作。 也许有人可以帮忙吗?

1 个答案:

答案 0 :(得分:3)

对于具有函数pluckerSide的那两个输入数组,似乎存在基于一些随机索引的索引,用于成对乘法和求和。所以,我会列出那些索引,用这些索引索引到数组中,最后使用matrix-multiplicationnp.dot来执行总和减少。

因此,一种方法就是这样 -

a_idx = np.array([0,1,2,4,5,3])
b_idx = np.array([4,5,3,0,1,2])
out = a[a_idx].dot(b[b_idx])

如果您在ab的所有行中循环执行此操作,从而生成形状为(m,n)的输出数组,我们可以像这样对其进行矢量化 -

out_all = a[:,a_idx].dot(b[:,b_idx].T)

为了让事情变得更轻松,我们可以重新安排a_idx,使其成为range(6)并使用该模式重新安排b_idx。所以,我们会:

a_idx = np.array([0,1,2,3,4,5])
b_idx = np.array([4,5,3,2,0,1])

因此,我们可以跳过索引到a,解决方案就是 -

a.dot(b[:,b_idx].T)