Что означает `[b для a в x для b в a, если не b==k]`?

Я был абсолютно озадачен:

indices = numpy.array([b for a in x for b in a if not b==k])

Любые указатели на то, как я должен читать [b for a in x for b in a if not b==k], в контексте x будучи двумерным массивом целых чисел и k быть целым числом? Или заключите в скобки это, чтобы помочь мне понять приоритет вещей?

2 ответа

Решение

Это выравнивает одно измерение x массив (я думаю, что код предполагает x является двумерным массивом) и удаляет каждое вхождение целого числа k, Например:

>>> import numpy as np

>>> x = np.arange(20).reshape(4, 5)  # makes it a 2D array
>>> x
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])
>>> k = 4

>>> inds = np.array([b for a in x for b in a if not b==k])
>>> inds
array([ 0,  1,  2,  3,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19])

Обратите внимание, что ваш код не использует мощную и быструю функциональность NumPy. Если x это массив, который вы можете просто использовать:

>>> x[x!=k]  # make it 1D and keep only values != k
array([ 0,  1,  2,  3,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19])

Это эквивалентно:

result = []
for a in x:
    for b in a:
        if not b == k:
            result.append(b)
indices = numpy.array(result)

Вы можете прочитать список понимания слева, чтобы написать и превратить их в отдельные циклы for.

Другие вопросы по тегам