Вызов np.sum (np.fromiter (генератор)) - PullRequest
2 голосов
/ 10 февраля 2020

У меня есть генератор, который возвращает numpy массивов. Например, ради, пусть это будет:

import numpy as np
a = np.arange(9).reshape(3,3)
gen = (x for x in a)

Вызов:

np.sum(gen)

Вкл. numpy 1.17.4 :

DeprecationWarning: вызов np.sum (генератора) устарел и в будущем даст другой результат. Вместо этого используйте np.sum (np.fromiter (генератор)) или встроенную сумму python.

Попытка рефакторинга вышеупомянутого:

np.sum(np.fromiter(gen, dtype=np.ndarray))

Я получаю:

ValueError: невозможно создать массивы объектов из итератора

Что не так в приведенном выше утверждении?

Ответы [ 3 ]

3 голосов
/ 10 февраля 2020

Проблема в втором аргументе, np.ndarray в fromiter(). Numpy fromiter ожидает 1D и возвращает массив 1D:

Создайте новый одномерный массив из повторяемого объекта.

Поэтому Вы не можете создавать объектные массивы из итератора. Кроме того, .reshape() также вызовет ошибку из-за того, что я указал в первой строке. В общем, это работает:

import numpy as np
a = np.arange(9)
gen = (x for x in a)
print(np.sum(np.fromiter(gen,float)))

Вывод:

36
1 голос
/ 10 февраля 2020

Как насчет простого преобразования вашего генератора в список и последующей передачи его в np.sum?

a = np.arange(9).reshape(3,3)
gen = (x for x in a)

Суммирование всех элементов:

>>> np.sum(list(gen))
36

Суммирование по столбцам:

>>> np.sum(list(gen), axis=0)
array([ 9, 12, 15])

Пошаговое суммирование:

>>> np.sum(list(gen), axis=1)
array([ 3, 12, 21])
1 голос
/ 10 февраля 2020

Поскольку вы суммируете экземпляры массивов, вы можете просто использовать встроенный sum:

result = sum(gen)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...