Как сохранить форму исходного списка, когда мы используем понимание списка? - PullRequest
2 голосов
/ 28 июня 2019

У меня есть список нулей с формой, как показано ниже:

yp = numpy.zeros(5, 2, 2), dtype = complex)

Я изменил его, используя два цикла for, как показано ниже:

for a in range(0,5):
    for b in range(0, 2):
        yp[a, b, b] = numpy.sum(F[a, b,:])

Как я могу сделать то же самоеиспользуя понимание списка?Очевидно, что использование строки ниже изменит форму моего исходного списка.

yp = [numpy.sum(F[a, b,:]) for a in range(0,5) for b in range(0, 2)]   

Ответы [ 2 ]

3 голосов
/ 28 июня 2019

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

Если ваша цель состоит в том, чтобы заполнить не назначенные элементы нулями, то соответствующее понимание списка может выглядеть примерно так:

[ [ [0,0,numpy.sum(y_network[a, b, :])] for b in range(2)] for a in range(5)]

Разница в том, что каждый уровень понимания создает список, который сам использует понимание для своих элементов.

Обратите внимание, что это не совсем то же самое, потому что значение numpy.sum(y_network[a, b, :])всегда помещается в последний элемент 3-го измерения вместо индекса b.Вы могли бы использовать еще немного кода для заполнения нулями влево и вправо, но это сделает его сложным и нечитаемым, что в значительной степени сведет на нет цель использования понимания списка.

Вы также можете написать один цикл для назначения:

for b in range(2): yl[:,b,b] = np.sum(network[:,b,:],1)
1 голос
/ 28 июня 2019

Проблема в том, что вы назначаете только [a, b, b] (диагонали матрицы 2 на 2) и оставляете все остальное, как есть, и это трудно сделать в понимании списка. Следующее будет делать то же, что и у вас, но неэффективно.

yp = numpy.array([numpy.sum(y_network[a, b,:]) if b==c else yp[a,b,b] for a in range(0,5) for b in range(0, 2) for c in range(0,2)]).reshape(5,2,2)

Или вы можете вставить yp[a,b,b] после

yp = [numpy.sum(y_network[a, b,:]) for a in range(0,5) for b in range(0, 2)]

с правильными индексами, чтобы сделать его более эффективным, но вложенный цикл должен быть лучше.

...