Как суммировать все элементы массива объектных данных? - PullRequest
0 голосов
/ 01 мая 2019

У меня есть массив numpy объектов, который состоит из нескольких обычных массивов numpy

>> a = np.array([np.arange(5), np.arange(2), np.arange(7)])
>> a
array([array([0, 1, 2, 3, 4]), array([0, 1]), array([0, 1, 2, 3, 4, 5, 6])], dtype=object)

И я хочу суммировать все элементы, и в идеале это должно дать мне 32. Если я использую sum(a), я получаю ошибку. Тем не менее, я могу получить результат, используя

>> sum([np.sum(array) for array in a])
32

Но мне было интересно, есть ли более быстрый / простой способ сделать это?

Ответы [ 2 ]

1 голос
/ 01 мая 2019

Пока ваш код в порядке, вы также можете использовать numpy.concatenate для объединения ваших массивов, а затем вычислить сумму с помощью numpy.sum , Python со встроенным sum или sum функция над массивом numpy

import numpy as np

a = np.array([np.arange(5), np.arange(2), np.arange(7)])

print(np.sum(np.concatenate(a)))
#32

print(sum(np.concatenate(a)))
#32

print(np.concatenate(a).sum())
#32

1 голос
/ 01 мая 2019

Использование numpy.concatenate с sum:

print (np.concatenate(a).sum())

print (np.sum(np.concatenate(a)))
32

Производительность : зависит от числавложенных массивов и количество значений в массивах, поэтому лучший тест в реальных данных:

a = np.array([np.arange(5), np.arange(2), np.arange(7)] * 1000) 
#print (a)

In [40]: %timeit np.concatenate(a).sum()
830 µs ± 22.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [41]: %timeit (np.sum(np.concatenate(a)))
835 µs ± 33.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

#original solution 
In [42]: %timeit sum([np.sum(array) for array in a])
15.3 ms ± 85.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

Другие решения:

In [43]: %timeit sum(np.sum(array) for array in a)
17.4 ms ± 2.27 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [44]: %timeit (sum(np.concatenate(a)))
2.28 ms ± 143 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...