Обрезка пустых массивов: какой метод лучше?

Рассмотрим следующий код:

a = np.arange (1,6)
b = np.array(["A", "B", "C", "D", "E"])
c = np.arange (21, 26)

a,b,c =   a[a> 3],b[a>3], c[a >3]
print a,b,c

Вывод: [4 5] ['D' 'E'] [24 25]

Я не могу понять, почему этот вывод отличается от следующего:

a = np.arange (1,6)
b = np.array(["A", "B", "C", "D", "E"])
c = np.arange (21, 26)

a = a[a>3]
b = b[a>3]
c = c[a>3]
print a,b,c

вывод: [4 5] ['A' 'B'] [21 22]

Любая идея?

1 ответ

В первой части, когда вы делаете:

a, b, c = a[a> 3], b[a>3], c[a >3]

это сделано за a = np.arange (1,6) - Значение a изменяется только после выполнения всех операций.

тогда как во второй части вы фильтруете b а также c над уже отфильтрованным и модифицированным array aпотому что это происходит после того, как вы сделали:

a = a[a>3]

Поэтому следующие строки фильтруются по массиву a, теперь равному [4, 5]

b = b[a>3]  # <-- over a = [4, 5] gives values at index 0 and 1
c = c[a>3]  # <-- over a = [4, 5] gives values at index 0 and 1

Во втором случае вы можете использовать временный массив для хранения отфильтрованных значений.

temp = a[a>3]
b = b[a>3]
c = c[a>3]
a = temp

или, как предложено в комментариях @hpaulj, сначала оцените и сохраните маску в переменной, а затем используйте ее столько раз, сколько необходимо, без необходимости переделывать работу:

mask = a > 3 
a = a[mask]
b = b[mask]
c = c[~mask]

Простое исправление состоит в том, чтобы обрезать массив "a" последним, а не первым!

b=b[a>3]
c=c[a>3]
a=a[a>3]

Если вы планируете выполнить несколько обрезок, то попробуйте временно сохранить [a>3] в переменной (как указано в другом ответе), что может помочь повысить эффективность вычислений.

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