2016-05-06 2 views
-1

Рассмотрим следующий код:Обрезка массивов numpy: какой лучший метод?

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] [ 'А' 'В'] [21 22]

Любая идея?

+0

Покажите нам результаты. Мы можем догадываться о том, что происходит, и даже copy-n-paste (вы лучше, чем большинство), но, тем не менее, было бы лучше, если бы мы могли напрямую прочитать результаты. – hpaulj

ответ

0

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

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] 

Таким образом, следующие строки фильтруются от массива а в настоящее время равно [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] 
+0

Это то, что я подозревал. Любопытством: отфильтровать все начальные массивы numpy над a> 3, является первым кодом наиболее эффективным и «правильным» методом? – user1363251

+0

Да, первый код - это рекомендуемый способ сделать это в python. Я уверен, что это также правильный способ с numpy. –

+0

Я считаю, что синтаксис немного вводит в заблуждение. Нищий может поверить, что первый код фактически реализует второй. Это на самом деле ошибка, которую сделал друг (который начинает изучать python). – user1363251