【问题标题】:What is the best vectorization method here?这里最好的矢量化方法是什么?
【发布时间】:2012-09-28 12:01:40
【问题描述】:

我想知道向量化以下公式的最佳方法是什么:

c= Sum(u(i)*<u(i),y>/v(i) )

&lt;.,.&gt; 表示两个矩阵的点积。

假设我们有一个矩阵K= U*Diag(w)*U^-1wu 是矩阵k 的特征值和特征向量,大小为nxn)。而y 是大小为n 的向量。

如果:

k=np.array([[1,2,3],[2,3,4],[2,7,8]])
y=np.array([1,4,5])
w,u=np.linalg.eigh(k)

然后:

w=array([ -2.02599523,   0.47346124,  13.552534  ])


u=array([[-0.18897996,  0.95770742,  0.21698634],
        [ 0.82245177,  0.03363605,  0.5678395 ],
       [-0.53652554, -0.28577109,  0.79402471]])

我是这样实现的:

uDoty=np.dot(u,y)
div=np.divide(y,w)

div=np.divide(uDoty,w)
r=np.tile(div,(len(u),1))
a=u*r.T
c=sum(a) 

但它实际上对我来说并不好看。所以有什么建议吗?

【问题讨论】:

  • 这有数学意义吗?也许 numpy/scipy 有一个内置函数可以从 k 计算 c
  • 是的。实际上它与求解方程 A*x=b 有点像,但是因为我需要使用这个公式来处理其他东西,所以我需要实现这个公式。实际上我通过 numpy.solve() 求解方程然后比较有了这个结果。
  • 你也可以试试np.einsum,当然不能用它进行除法,你必须乘以倒数(但单独使用np.dot比用blas的einsum更快)。你真的需要np.tile吗? Numpy 自动广播数组,因此足以正常添加一维轴。 temp 是干什么用的?
  • 这个功能我没用过。我应该检查如何使用它!我使用 np.tile 因为它是我想到的唯一解决方案!对不起“temp”,它是预览代码的剩余部分。我删除它。

标签: python numpy vectorization


【解决方案1】:

您可以避免使用np.tile 进行一些广播:

U = np.dot(u, y)
d = U/w
a = u*d[:,None]
c = a.sum()

【讨论】:

  • 谢谢,帮了大忙。也是优化方案吗?
  • 我不确定你的意思。
  • 我的意思是它是计算解决方案的最快方法吗?因为我的矩阵可能非常大!
  • 我不知道它是不是最快的,但它是最易读的,没有太多需要简化的地方。你可能想跳过一些临时的,比如直接计算(u*d[:,None]).sum(),但我认为它不会有太大变化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-28
  • 2018-07-06
  • 1970-01-01
  • 1970-01-01
  • 2014-09-21
  • 2012-05-24
  • 2010-12-03
相关资源
最近更新 更多