Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将此代码从python循环重写为numpy向量(用于性能)?_Python_Performance_Algorithm_Numpy_Vectorization - Fatal编程技术网

如何将此代码从python循环重写为numpy向量(用于性能)?

如何将此代码从python循环重写为numpy向量(用于性能)?,python,performance,algorithm,numpy,vectorization,Python,Performance,Algorithm,Numpy,Vectorization,我有以下代码: 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

我有以下代码:

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
int,int,int,float(常量)

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


一维numpy数组(self.max_i)。

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

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]]
jrange=np.arange(self.max\u j-j\u start)
joffset=np.round(jrange*discriminant).astype(int)
i=np.arange(自最大值i)
对于jrange中的j:
new_i=i+joffset[j]
in_range=新_i
这两个循环都可以矢量化,但我认为这会很棘手


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

不幸的是,它更复杂:(感谢您的贡献,但它对我没有帮助。您在解决方案中寻找什么?任何东西的矢量化的通用方法“超出了讨论的范围”。我更新了解决方案,使其与您的代码一样(我认为)。这有帮助吗?好的,thx u.-)它在最后一行仍然告诉“IndexError:用作索引的数组必须是整数(或布尔)类型”,但现在它可能会帮助我。我想我稍后会接受你的回答,当我解决这个任务时。我在np.round调用中添加了一个对astype(int)的调用。这应该可以解决这个问题。
standard
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]]