我想在 for 循环中添加所有列表并制作一个 ndarray
I want to add all lists in for loop and make one ndarray
例如
我有一个列表
[[1,2,3], [4,5,6], [7,8,9], [10,11,12], ...]
我想在for循环中添加所有列表并制作一个ndarray,
关注
for list in lists:
sum function...
结果我想要的是
[22, 26, 30]
我怎样才能把它写成漂亮的代码?
如果你使用的是 NumPy,那很简单:
import numpy as np
l = [[1,2,3], [4,5,6], [7,8,9], [10,11,12]]
arr = np.array(l)
result = arr.sum(axis=0)
print(result)
# [22 26 30]
对于纯 Python 解决方案:
l = [[1,2,3], [4,5,6], [7,8,9], [10,11,12]]
result = [sum(column) for column in zip(*l)]
print(result)
# [22, 26, 30]
NumPy 解决方案会更快。
In [1]: import numpy as np
In [2]: arr = np.arange(10 ** 6).reshape(10 ** 3, 10 ** 3)
In [3]: %timeit arr.sum(axis=0)
881 µs ± 22.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [4]: l = arr.tolist()
In [5]: %timeit [sum(x) for x in zip(*l)]
76.8 ms ± 1.84 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
你不需要 Numpy 就可以做到这一点,只需要使用 python 的基础。 (所有子列表的长度必须相同)
l = [[1,2,3], [4,5,6], [7,8,9], [10,11,12]]
result = [sum(subL[i] for subL in l) for i in range(len(l[0]))]
或者,没有列表理解:
result = []
for i in range(len(l[0])):
n = 0
for x in l:
n += subL[i]
result.append(n)
两者都产生输出 [22, 26, 30]
。
如果你对性能感兴趣,我写了这个(不确定是否准确):
from timeit import timeit
import numpy as np
l = [[1,2,3], [4,5,6], [7,8,9], [10,11,12]]
def listComprehension():
result = [sum(subL[i] for subL in l) for i in range(len(l[0]))]
def basic():
result = []
for i in range(len(l[0])):
n = 0
for subL in l:
n += subL[i]
result.append(n)
def zipped():
result = [sum(column) for column in zip(*l)]
def numpyied():
arr = np.array(l)
result = arr.sum(axis=0)
print(timeit("listComprehension()", setup = "from __main__ import listComprehension"))
# 3.738487364
print(timeit("basic()", setup = "from __main__ import basic"))
# 1.953782115
print(timeit("zipped()", setup = "from __main__ import zipped"))
# 1.413262091
print(timeit("numpyied()", setup = "from __main__ import numpyied"))
# 9.576366059999998
令人惊讶的是 numpy
更慢,但我不能说为什么。 (最后两个函数取自)
例如 我有一个列表
[[1,2,3], [4,5,6], [7,8,9], [10,11,12], ...]
我想在for循环中添加所有列表并制作一个ndarray,
关注
for list in lists:
sum function...
结果我想要的是
[22, 26, 30]
我怎样才能把它写成漂亮的代码?
如果你使用的是 NumPy,那很简单:
import numpy as np
l = [[1,2,3], [4,5,6], [7,8,9], [10,11,12]]
arr = np.array(l)
result = arr.sum(axis=0)
print(result)
# [22 26 30]
对于纯 Python 解决方案:
l = [[1,2,3], [4,5,6], [7,8,9], [10,11,12]]
result = [sum(column) for column in zip(*l)]
print(result)
# [22, 26, 30]
NumPy 解决方案会更快。
In [1]: import numpy as np
In [2]: arr = np.arange(10 ** 6).reshape(10 ** 3, 10 ** 3)
In [3]: %timeit arr.sum(axis=0)
881 µs ± 22.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [4]: l = arr.tolist()
In [5]: %timeit [sum(x) for x in zip(*l)]
76.8 ms ± 1.84 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
你不需要 Numpy 就可以做到这一点,只需要使用 python 的基础。 (所有子列表的长度必须相同)
l = [[1,2,3], [4,5,6], [7,8,9], [10,11,12]]
result = [sum(subL[i] for subL in l) for i in range(len(l[0]))]
或者,没有列表理解:
result = []
for i in range(len(l[0])):
n = 0
for x in l:
n += subL[i]
result.append(n)
两者都产生输出 [22, 26, 30]
。
如果你对性能感兴趣,我写了这个(不确定是否准确):
from timeit import timeit
import numpy as np
l = [[1,2,3], [4,5,6], [7,8,9], [10,11,12]]
def listComprehension():
result = [sum(subL[i] for subL in l) for i in range(len(l[0]))]
def basic():
result = []
for i in range(len(l[0])):
n = 0
for subL in l:
n += subL[i]
result.append(n)
def zipped():
result = [sum(column) for column in zip(*l)]
def numpyied():
arr = np.array(l)
result = arr.sum(axis=0)
print(timeit("listComprehension()", setup = "from __main__ import listComprehension"))
# 3.738487364
print(timeit("basic()", setup = "from __main__ import basic"))
# 1.953782115
print(timeit("zipped()", setup = "from __main__ import zipped"))
# 1.413262091
print(timeit("numpyied()", setup = "from __main__ import numpyied"))
# 9.576366059999998
令人惊讶的是 numpy
更慢,但我不能说为什么。 (最后两个函数取自