改进我的Python代码

时间:2014-11-07 07:56:27

标签: python numpy

我想重新编写这些代码行以使其更具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?如果可能的话,我不想使用循环。

2 个答案:

答案 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]

该版本使用NewAxisbroadcasting

答案 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模块的任何依赖性,否则您将使用它们作为附加组件。