2

我有这个代码:

for j in xrange (j_start, self.max_j):
   for i in xrange (0, self.max_i):
      new_i = round (i + ((j - j_start) * discriminant))
      if new_i >= self.max_i:
         continue 
      self.grid[new_i, j] = standard[i]

我想通过丢弃缓慢的原生 python 循环来加速它。有可能改用 numpy 向量运算,它们真的很快。怎么做?

j_start, self.max_j, self.max_i, discriminant

整数、整数、整数、浮点数(常量)。

self.grid

二维 numpy 数组(self.max_i x self.max_j)。

standard

一维 numpy 数组(self.max_i)。

4

1 回答 1

2

这是一个完整的解决方案,也许会有所帮助。

jrange = np.arange(self.max_j - j_start)
joffset = np.round(jrange * discriminant).astype(int)
i = np.arange(self.max_i)

for j in jrange:
    new_i = i + joffset[j]
    in_range = new_i < self.max_i
    self.grid[new_i[in_range], j+j_start] = standard[i[in_range]]

可能可以对两个循环进行矢量化,但我认为这会很棘手。

我没有对此进行测试,但我相信它计算的结果与您的代码相同。

于 2012-12-05T02:02:29.217 回答