【问题标题】:Python compute a specific inner product on vectorsPython 计算向量的特定内积
【发布时间】:2017-02-08 16:41:30
【问题描述】:

假设有两个向量,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 工作。 也许有人可以在这里提供帮助?

【问题讨论】:

  • 所以,pluckerSide 中的a 是原始输入数组a 中的每一行吗?同样适用于b?您能否分享生成ab 的循环代码,您将这些代码输入pluckerSide(a,b)
  • a,b 是 Plucker 空间中的 Lines,一个 6 空间表示几何线条。所以 a 或 b 中的每一行都是 3d 中的一行。 pluckerside 计算这 2 条线的内积,给出它们在空间中彼此通过的哪一侧的信息(或者如果它们相交,它的 ==0)

标签: python numpy vector vectorization


【解决方案1】:

似乎有一个基于一些随机索引的索引,用于成对乘法和使用函数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)

【讨论】:

  • 两种解决方案都能完美运行。谢谢。现在我正在优化其余的代码,并且可能将其“分块”,因为这样它使用了更多的内存(以 10e4 float32 的顺序查看 m,n - 很容易跨越几场演出)
  • @Max 是分块,如上一篇文章所示-stackoverflow.com/a/39751039/3293881
猜你喜欢
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-12
  • 2021-11-24
  • 2021-01-23
相关资源
最近更新 更多