Обрезка пустых массивов: какой метод лучше?
Рассмотрим следующий код:
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] в переменной (как указано в другом ответе), что может помочь повысить эффективность вычислений.