Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.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 如何高效地对矩阵的各个部分执行计算?_Python_Python 3.x_Numpy - Fatal编程技术网

Python 如何高效地对矩阵的各个部分执行计算?

Python 如何高效地对矩阵的各个部分执行计算?,python,python-3.x,numpy,Python,Python 3.x,Numpy,我的一位同事正在用Python进行一些化学过程模拟,我偶尔会帮他们调试。我经常看我们的代码,认为它一定写得很糟糕,只是因为它看起来如何,但我不知道,也想不出更好的方法来处理这个问题 为了快速地进行一些计算,我们在numpy数组中有一组状态变量Theta。在Theta[i][j]中,在整个过程中,j变量存储在i时间或位置。我们将变量存储在一个numpy数组中,尽管我将要描述的问题是,字典是一个好的数据结构,因为我们通常执行排序Theta@b的计算,矩阵表示是自然的 但在许多函数中,我们只使用了θ中

我的一位同事正在用Python进行一些化学过程模拟,我偶尔会帮他们调试。我经常看我们的代码,认为它一定写得很糟糕,只是因为它看起来如何,但我不知道,也想不出更好的方法来处理这个问题

为了快速地进行一些计算,我们在numpy数组中有一组状态变量
Theta
。在
Theta[i][j]
中,在整个过程中,
j
变量存储在
i
时间或位置。我们将变量存储在一个numpy数组中,尽管我将要描述的问题是,字典是一个好的数据结构,因为我们通常执行排序
Theta@b
的计算,矩阵表示是自然的

但在许多函数中,我们只使用了θ中的一些变量,为了让函数在有人用过程中关系的数学推导来观察时可以解释,我们有如下的东西:

Y_A,Y_H,f_P,i_XB,i_XP\
穆,库斯,库斯,库斯,库斯,哦,库斯,不,库斯坐着\
b_H,nu_g,nu_H,k_H,k_X\
穆阿,库恩,布阿,库阿,库阿\
五、 _u,u,u,u=Theta.T#将每个变量解包成一个向量
D_1=Y_A/(1+Y_H*f_P)-i_XB**2(Y_A+…#长公式)
D_2=Y_A/(1+Y_H*f_P)-i_XB**2(Y_H+…#长公式)
必须有更好的方法。如果我们不需要在矩阵计算中使用
Theta
,比如
Theta@b
,我会将数据放在字典中,以避免可怕的解包,但这并不能解决公式庞大的问题。事实上,这看起来更糟:

D=make_dictionary()#使用前面示例中显示的键制作一个字典
D['D_1']=D['Y_A']/(1+D['Y_H']*D['f_P'])-D['i_XB']**2(D['Y_A']+…;这更不利于阅读
D['D_2']=D['Y_A']/(1+D['Y_H']*D['f_P'])-D['i_XB']**2(D['Y_H']+…;这更不利于阅读
很明显,这些公式可以分成几个部分,但大多数都是经验公式,因此单个部分本身没有多大意义:

D_1=calc_D1_Term 1(Y_A,Y_H,f_P)+calc_D1_Term 2(i_XB,Y_A,mu_A,K_NH,b_A)+calc_D1_Term 3(mu_A,K_NH,b_A,K_OA)
比我们开始的要好一点,计算单个项的函数比一长串计算更容易验证,如
D_1=Y_a/(1+Y_H*f_p)-i_XB**2(Y_A+…
),但是当一个计算重复多次时,额外的函数调用会带来明显的开销,添加这样的函数使我们的模拟从大约30秒增加到大约20分钟

用函数和类来帮助分解这些内容有助于提高可读性,但会使执行速度慢得令人无法忍受。我们如何在不牺牲运行时的情况下构建这些内容,使其更清晰