我想重新编写这些代码行以使其更具Python,但我找不到好方法:
conversion_factor = 1.0 # for easier reading
mass_left = [0.1, 0.2, 0.7]
mass_right = [0.3, 0.5, 0.1]
volumes = np.array([0.4, 0.7, 0.2])**3
# Unhappy with next two lines
left_rho = np.array([[(i*conversion_factor)/j for i in mass_left] for j in volumes])
right_rho = np.array([[(i*conversion_factor)/j for i in mass_right] for j in volumes])
我的想法是去寻找更像:
masses = [[0.1, 0.2, 0.7], [0.3, 0.5, 0.1]]
rhos = []
# This line
rhos.append(np.array([[(i*conversion_factor)/j for i in mass_left] for j in volumes]))
在上面的一行中,我错过了一个正确的方法来解决我的群众列表中的两个嵌套列表。什么是最蟒蛇的方式在这里继续?或者你会建议从我的计算中创建一个函数并使用map()或itertools?如果可能的话,我不想使用循环。
答案 0 :(得分:0)
假设conversion_factor
是标量:
mass_left = array([0.1, 0.2, 0.7])
mass_right = array([0.3, 0.5, 0.1])
volumes = array([0.4, 0.7, 0.2])**3
left_rho = mass_left[None, :] * conversion_factor / volumes[:, None]
该版本使用NewAxis和broadcasting。
答案 1 :(得分:0)
你忘了给我们转换因子 - 目前我会把它作为1?
你可以将mass_left和mass_right更新为mass。这对你有用吗?
volumes = []
for i in [0.4, 0.7, 0.2]: # your original code - assuming you need them?
volumes.append(i**3);
rhos = [];
temp = [];
elems = 0;
for i in mass:
for j in volumes:
temp.append(conv_factor*i[elems]/j)
elems += 1;
elems = 0;
rho.append(temp);
temp = [];
# The result comes as
# [[1.5624999999999998, 0.5830903790087465, 87.49999999999997], [4.687499999999999,
# 1.4577259475218662, 12.499999999999998]]
#
#
这是你期望的结果吗?
N.B。如果你没有注意到我,我没有使用任何numpy。这将删除对非标准Python模块的任何依赖性,否则您将使用它们作为附加组件。