【问题标题】:Python: efficiently generating a vector with different valuesPython:有效地生成具有不同值的向量
【发布时间】:2011-03-31 18:24:16
【问题描述】:

我正在用 Python 编写一个科学应用程序,到目前为止我的算法的性能很糟糕。我试图找到一种有效的方法来编码我正在做的事情。基本上,我必须乘以

 def get_thing(self, chi, n):

    return np.sum(self.an[n][j] * pow(chi, -j) for j in xrange(1, self.j))

其中self.an[i][j] 是先前生成的数组。然后我必须这样做:

 pot = np.sum(self.coeffs[n] * self.get_thing(chi, n) for n in xrange(0, self.n))

chi 发生更改且无法缓存的位置,因为它是在此类之外生成的点。当然,这是非常缓慢的,而且不是很亮。我该如何改进?

谢谢!

【问题讨论】:

    标签: python numpy scipy


    【解决方案1】:

    get_things 中,您当然可以将事情简化为:

    def get_thing(self, chi, n):
    
        return np.sum(self.an[n,1:self.j] * np.power(chi,-np.arange(1,self.j)))
    

    请注意,您不想使用 [i][j] 表示法来索引 numpy 数组;而是使用 [i,j]。

    您可以按照@eat 的建议使用更高级别的广播进行进一步改进。

    编辑: 对上述代码进行了一些更改,以尝试使索引与 OP 匹配,并更改了我的代码中的符号错误。

    【讨论】:

    • 谢谢。问题是 chi 不是向量,它是为每个新的 run 函数调用生成的。
    • @Ivan 如果chi 是一个浮点数,那么y = np.power(chi,x) 其中x 是一个数组将产生一个数组,其中y 的第i 个元素,y_i = chi^x_i。这是一个 numpy 广播功能。我提供的代码应该等同于您最初编写的get_thing,但要快得多。
    【解决方案2】:

    简单地说,尝试在更高的抽象级别进行计算,即尽量避免 python 级别的循环。

    仔细研究如何进行元素操作以及broadcasting 的操作方式,最后但并非最不重要的一点是不要忘记linear algebra 的强大功能!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多