Numpy.Matmul 和 Numpy.Dot:使用 Numpy 内置函数加速代码

Numpy.Matmul and Numpy.Dot: Accelerating code by using Numpy in-built functions

我试图在我的代码中加速一个函数。

我写的初始函数是:

def f(self):
    temp = 0
    for i in range(self.N):
        for j in range(self.N):
            a = self.Asolution[:, j]
            b = self.Bsolution[:, i]
            c = self.Matrix[j][i]

            d = c*np.multiply(a, b)
            temp += simps(d, self.time)
    return temp

其中 self.Asolution = odeint(...) self.Bsolution.

相同

self.Matrix 是大小为 self.N x self.N 的方阵,simps 是辛普森积分。 self.Asolutionself.Bsolution 具有尺寸 (t x N)。

但是,我需要多次调用这个函数,并且self.N 很大,所以需要很长时间。因此,我决定尝试使用 numpy 内置函数,因为我主要处理矩阵乘法。我倾向于对所有事情都使用 for 循环,这不是最明智的选择……因此,我对内置的 numpy 函数有点不熟悉。我将函数修改为:

def f(self):
   d = np.dot(np.dot(self.Asolution, self.Matrix), self.Bsolution.transpose())
   d = np.array(d)
   temp = simps(d, self.time)
   temp = sum(temp)
 
   return temp

这明显更快,但我没有得到与上面相同的结果。

我想我误解了 np.dot 的用法,或者我错过了矩阵相乘的方式。 我的主要目标是从第一个代码中删除双 for 循环,因为它需要永远。我在这里错过了什么?提前感谢您的任何提示!

编辑:

self.Asolution self.Bsolution 的大小为 (t x N) - 每一列都是不同的位置,行表示位置如何随时间演变。

self.Matrix 大小为 (N x N)。

让我们试试这个-


# self.t x self.N ----> self.N x self.t x 1
# arranging one column in one layer
self.Bsolution = np.swapaxes(np.expand_dims(self.Bsolution, axis=-1), 0, 1)

# self.N x self.t x self.N == N columns of Bsolution multiplied with N columns of Asolution
# multiplying 1 column of B with N columns of A in a layer done for N layers
product = np.multiply(self.Bsolution, self.Asolution)

# self.N x self.N ----> self.N x 1 x self.N 
self.Matrix = np.expand_dims(self.Matrix, axis=1)

# integration need to take place along axis=1 i believe
# multiplying each of N x N columns(4 rows in length) with N x N matrix elements
result = np.sum(simps(np.multiply(self.Matrix, product), self.time))

让我知道它是否有效

经过多次试验和错误,我设法找到了一种比使用双 for 循环更快地获得相同结果的方法。我 post 它只是为了完整性和关闭问题。

n = len(self.time)
d = [np.matmul(np.matmul(self.Asolution[:][i], self.Matrix),
     self.Bsolution[:][i].transpose) for i in range(n)]
temp = np.simps(d, self.time)