【问题标题】:Vectorizing numpy loops向量化 numpy 循环
【发布时间】:2017-04-29 10:49:51
【问题描述】:

我一直在尝试将以下代码的循环向量化。 (为 cmets 编辑)

M, N, F = 10, 50, 30
ts = np.linspace(0.001,3,M)
v = np.random.rand(N,1)
A = np.random.rand(N,N)
D = np.zeros(shape=(N,N,M)) 
for i, t in enumerate(ts):
   for x in range(0,N): 
      for y in range(x,N): 
         D[x,y,i] = np.sum( np.exp(-t * v[0:F]) * A[x,0:F] * A[y,0:F] )
         D[y,x,i] = D[x,y,i]

我一直在阅读其他问题,但不知道如何在这里应用它。

建议?

【问题讨论】:

  • 请添加tsvAF 的最小示例。
  • 循环是否按照您想要的方式工作?
  • nfF 是什么?

标签: python numpy vectorization


【解决方案1】:

这是一种使用broadcastingmatrix-multiplicationnp.dot 组合的矢量化方法-

# Get r,c indices corresponding to indices along dim-0,1 for o/p
r,c = np.triu_indices(N)
vals = (A[r,:F] * A[c,:F]).dot(np.exp(v[:nf,None]*(-ts)))

# Initialize o/p array and assign values
out = np.empty(shape=(N,N,M))
out[r,c,:] = vals
out[c,r,:] = vals

【讨论】:

  • 不幸的是,我收到了 MemoryError,但还是谢谢 :)
  • @user3658307 是的,如果您使用的是非常大的数组,请坚持使用循环代码,因为矢量化的东西需要同时加载大量的东西。
猜你喜欢
  • 2013-07-21
  • 2013-11-19
  • 1970-01-01
  • 2018-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-20
  • 1970-01-01
相关资源
最近更新 更多