使用嵌套循环和 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
求和计算得出的]、d
、f
、FREQ
相应:
图一.
变量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
列表与 @user7138814 的 P
列表不匹配。
哪种策略是解决此问题的正确策略(参见 图 1)?
+=
策略或[i] + [i-1]
策略?
您还需要一个 for 循环,因为您有 3 种不同长度的数组(即您的参数 space 是 3 维的)。您从 volume_FREQ.dat
加载的 V
和 FREQ
实际上是二维数据。所以通过重塑和另一个循环你会得到类似的东西:
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 循环相同的结果。
我有一个文件: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
求和计算得出的]、d
、f
、FREQ
相应:
图一.
变量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
列表与 @user7138814 的 P
列表不匹配。
哪种策略是解决此问题的正确策略(参见 图 1)?
+=
策略或[i] + [i-1]
策略?
您还需要一个 for 循环,因为您有 3 种不同长度的数组(即您的参数 space 是 3 维的)。您从 volume_FREQ.dat
加载的 V
和 FREQ
实际上是二维数据。所以通过重塑和另一个循环你会得到类似的东西:
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 循环相同的结果。