Numpy 2D点操作,索引和迭代。如何优化?

时间:2014-06-04 22:57:01

标签: python optimization numpy

我需要从代码中删除这个瓶颈。希望有人可以帮助我。

我有以下迭代(从nn反距离插值算法中提取):

jinterpol=0
for w, ix in zip(wds, ixs):
        wz = np.vdot(w, z[ix])
        result[jinterpol] = wz
        jinterpol += 1

我尝试删除for循环:

result = np.dot(wds, z[ixs])

但当然它说ValueError:对象未对齐

你可以给我一些提示吗?非常感谢。

形状是:

  • wds:(550800,8)
  • z:(212065,)
  • z [ixs]:(550800,8)
  • ixs:(550800,8)

  • len(zip(distance,ixs)):550800
  • w:(8,)
  • ix:(8,)

1 个答案:

答案 0 :(得分:3)

您可以使用np.einsum

>>> import numpy as np
>>> wds = np.random.rand(550800, 8)
>>> z = np.random.rand(212065)
>>> ixs = np.random.randint(212065, size=(550800, 8))

>>> np.einsum('ij,ij->i', wds, z[ixs])
array([ 1.65069924,  3.26203701,  3.16035664, ...,  1.76963986,
        2.09727537,  1.94905991])

>>> np.vdot(wds[0], z[ixs[0]])
1.6506992361953157
>>> np.vdot(wds[1], z[ixs[1]])
3.2620370116548827