【发布时间】:2015-03-29 10:28:07
【问题描述】:
一些计量经济学工作。
在给定(可能)大量并行数据数组的情况下,我经常需要导出多个计算变量的并行数组。
在下面的示例中,我有两个输入数组和两个输出数组,但想象一下在现实世界中可能有 5-10 个输入和输出数组。
w, x 是输入
y, z 是输出
方法一:
w = [1, -2, 5]
x = [0, 3, 2]
N = len(w)
I = range(N)
y = map(lambda i: w[i] + x[i], I)
z = map(lambda i: w[i] - x[i], I)
方法B:
w = [1, -2, 5]
x = [0, 3, 2]
N = len(w)
I = range(N)
y, z = [], []
for i in I:
y.append(w[i] + x[i])
z.append(w[i] - x[i])
方法C:
w = [1, -2, 5]
x = [0, 3, 2]
y, z = [], []
for w_i, x_i in zip(w, x):
y.append(w_i + x_i)
z.append(w_i - x_i)
方法D:
w = [1, -2, 5]
x = [0, 3, 2]
N = len(w)
I = range(N)
(y, z) = transpose(map(lambda i: [w[i] + x[i], w[i] - x[i]], I))
D 似乎是最简洁、可扩展和高效的。但它也是最难阅读的,尤其是有许多具有复杂公式的变量。
A 是我最喜欢的,有一点重复,但是为每个变量构建一个循环效率会降低吗?这不会随着大数据而扩展吗?
B vs. C:我知道 C 更符合 Python 风格,但 B 似乎更方便、更简洁,并且可以通过更多变量更好地扩展。在这两种情况下,我都讨厌我必须预先声明变量的额外行。
总的来说,我对上述任何一种方法都不完全满意。我的推理中是否缺少某些东西,还是有更好的方法?
【问题讨论】:
-
你考虑过使用numpy吗? Python 中的大多数科学计算都是在 numpy 中完成的。在 numpy 中,这只是
y = w + x; z = w - x。 -
@senshin,为什么不
y, z = w + x, w - x? -
@PadraicCunningham 我的意思是,这有关系吗?他们都做同样的事情。
-
@senshin,是的,一个是 pythonic,另一个不是。
-
@PadraicCunningham 来吧,你知道我使用分号是因为 cmets 中不能有换行符。
标签: python arrays loops for-loop iteration