Я хочу добавить все списки для цикла и сделать один ndarray - PullRequest
0 голосов
/ 20 марта 2019

например, у меня есть список списков

[[1,2,3], [4,5,6], [7,8,9], [10,11,12], ...]

Я хочу добавить все списки в цикле for и создать один ndarray,

как следующий

for list in lists:
    sum function...

и результат, что я хочу, это то, что

[22, 26, 30]

как я могу написать это в хорошем коде?

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Если вы используете 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)
0 голосов
/ 20 марта 2019

Вы можете сделать это без необходимости использования 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 медленнее, но я не могу сказать, почему.(Две последние функции были взяты из ответа @ Tomothy32 )

...