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.Asolution
和 self.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)
我试图在我的代码中加速一个函数。
我写的初始函数是:
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.Asolution
和 self.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)