使用嵌套循环和 zip 的求和

A summation using nested loop and zip

我有一个文件:volume_FREQ.dat:

# Volume (V)  FREQ    mode
18.1          400.9    1      #| 
18.1          401.3    2      #| 1st Volume: 18.1
18.1          404.2    3      #| 
18.1          505.2    4      #|
19.2          202.4    1           #|  
19.2          203.6    2           #| 2nd Volume: 19.2 
19.2          205.4    3           #|
19.2          199.5    4           #|

真实文件共11卷,每卷45种模式

然后我有这个文件:parameters.dat :

# c           d         f        mode
-1.14     -24.70     1297.20     1
-1.24     -22.60     1295.20     2
-1.54     -21.08     1296.20     3
-1.72     -22.4      1298.40     4        

对于这 11 卷中的每一卷,都有 P 的值。在以下公式中,这由 P(V) 表示:每个 Volume 处的 P 值是通过使用 [=26= 的值对 modes 求和计算得出的]、dfFREQ相应:

图一.

变量T是这个列表:

 T =  [10.0, 30.1, 50.2]

真正的列表长度为100。

对于每个 T 和每个 V 都有一个值 P

最终的解决方案是得到一个像 data.dat :

这样的文件
# Volume (V)  FREQ    mode   T        P
18.1          400.9    1    10.0     x            #| 
18.1          401.3    2    10.0     x            #| 1st Volume: 18.1
18.1          404.2    3    10.0     x            #| 
18.1          505.2    4    10.0     x            #|
19.2          202.4    1    10.0     x                #|  
19.2          203.6    2    10.0     x                #| 2nd Volume: 19.2 
19.2          205.4    3    10.0     x                #|
19.2          199.5    4    10.0     x                #|
18.1          400.9    1    30.1     x            #| 
18.1          401.3    2    30.1     x            #| 1st Volume: 18.1
18.1          404.2    3    30.1     x            #| 
18.1          505.2    4    30.1     x            #|
19.2          202.4    1    30.1     x                #|  
19.2          203.6    2    30.1     x                #| 2nd Volume: 19.2 
19.2          205.4    3    30.1     x                #|
19.2          199.5    4    30.1     x                #|
18.1          300.1    1    50.2     x            #| 
18.1          305.2    2    50.2     x            #| 1st Volume: 18.1
18.1          303.6    3    50.2     x            #| 
18.1          303.9    4    50.2     x            #|
19.2          304.5    1    50.2     x                #|  
19.2          305.9    2    50.2     x                #| 2nd Volume: 19.2 
19.2          306.5    3    50.2     x                #|
19.2          307.1    4    50.2     x                #|

每个输入变量都可以通过 numpy:

轻松提取
import numpy as np
c, d, f, mode = np.loadtxt('parameters.dat', skiprows = 1).T
V, FREQ, mode = np.loadtxt('Volume_FREQ.dat',  skiprows = 1).T

然而,当应用公式并循环 modes:

时,困难就来了

我可以创建一个 VOLUME 列表:

 VOLUME = [19.2, 18.1]

然后是嵌套循环 + zip:

 sum_for_each_volume = []
 for i_VOLUME in VOLUME:

   P_CORRECT = []

   for j_c1, j_d, j_FREQ, i_T in zip(c1, d, FREQ, T):

        P = j_FREQ * i_T * (i_VOLUME * j_c1 + j_d)

        P_CORRECT.append(P)

   summation = sum(P_CORRECT)

   sum_for_each_volume.append(summation)

但是,此解决方案并未正确抓取每个卷的 FREQS,而且所有 T 元素未被每个 volume.

读取

如果你能帮助我,我将不胜感激。

基于@user7138814 的回答:

运行 这个脚本:

import numpy as np
n_volume = 2
n_mode = 4
n_T = 3

c, d, f, mode = np.loadtxt('parameters.dat', skiprows = 1).T
V, FREQ, mode = np.loadtxt('Volume_FREQ.dat',  skiprows = 1).T
T =  [10.0, 30.1, 50.2]

V = V.reshape(n_volume, n_mode)
FREQ = FREQ.reshape(n_volume, n_mode)


P_for_each_volume_and_each_T = []

for i in range(n_volume):
  for j in range(n_T):
    P = 0
    for k in range(n_mode)
        P += FREQ[i,k] * T[j] * (V[i,k]*c[k] + d[k])
    P_for_each_volume_and_each_T.append(P)


print 'P = ', P_for_each_volume_and_each_T

输出如下:

P = [-830821.31000000006, -2500772.1431000005, -4170722.9762000004, -403382.67200000002, -1214181.8427200001, -2024981.0134400004]

但是,通过使用P_for_each_volume_and_each_T[i] = P_for_each_volume_and_each_T[i] + P_for_each_volume_and_each_T[i-1]策略,如下所示(运行以下脚本):

import numpy as np

n_volume = 2 
n_mode = 4

n_T = 3

c, d, f, mode = np.loadtxt('parameters.dat', skiprows = 1).T
V, FREQ, mode = np.loadtxt('Volume_FREQ.dat',  skiprows = 1).T
T =  [10.0, 30.1, 50.2]

V = V.reshape(n_volume, n_mode)
FREQ = FREQ.reshape(n_volume, n_mode)


P_for_each_volume_and_each_T = []

for i in range(n_volume):

  for j in range(n_T):
    P = 0
    for k in range(n_mode):
        P = FREQ[i,k] * T[j] * (V[i,k]*c[k] + d[k])
        print 'FREQ[i,k] = ', FREQ[i,k]
        print 'V[i,k] = ', V[i,k]
        print 'c[k] = ', c[k]
        print 'd[k] = ',  d[k]
        print 'P = ', P
    P_for_each_volume_and_each_T.append(P)
print 'P = ', P_for_each_volume_and_each_T


for i in xrange(1,len(P_for_each_volume_and_each_T)):
    P_for_each_volume_and_each_T[i] = P_for_each_volume_and_each_T[i] + P_for_each_volume_and_each_T[i-1]


print 'P after summing= ', P_for_each_volume_and_each_T

你得到这个输出:

P = [-270443.66399999999, -814035.42863999994, -1357627.19328, -110570.88, -332818.34880000004, -555065.81760000007]

这在求和时完全有意义:

P after summing= [-270443.66399999999, -1084479.0926399999, -2442106.2859199997, -2552677.1659199996, -2885495.5147199994, -3440561.3323199996]

因此,P after summing 列表与 @user7138814P 列表不匹配。

哪种策略是解决此问题的正确策略(参见 图 1)?

+=策略[i] + [i-1]策略?

您还需要一个 for 循环,因为您有 3 种不同长度的数组(即您的参数 space 是 3 维的)。您从 volume_FREQ.dat 加载的 VFREQ 实际上是二维数据。所以通过重塑和另一个循环你会得到类似的东西:

import numpy as np

n_volume = 11
n_mode = 45
n_T = 3

c, d, f, mode = np.loadtxt('parameters.dat', skiprows = 1).T
V, FREQ, mode = np.loadtxt('Volume_FREQ.dat',  skiprows = 1).T
T =  [10.0, 30.1, 50.2]

V = V.reshape(n_volume, n_mode)
FREQ = FREQ.reshape(n_volume, n_mode)

P_for_each_volume_and_each_T = []
for i in range(n_volume):
    for j in range(n_T):
        P = 0
        for k in range(n_mode)
            P += FREQ[i,k] * T[j] * (V[i,k]*c[k] + d[k])
        P_for_each_volume_and_each_T.append(P)

一个更 numpythonic 的是下面的数组操作:

V = V.reshape(n_volume, n_mode)
FREQ = FREQ.reshape(n_volume, n_mode)
T = np.array(T).reshape(-1, 1, 1)
P_for_each_volume_and_each_T = (FREQ * T * (V*c + d)).sum(axis=0)

这将给出一个 (n_volume, n_T) 二维数组。使用 ravel 获得与 for 循环相同的结果。