NumPy

2015-07-13 21 views
7

'daki diğer tüm öğeleri çıkarma Hayatımı çözemiyorum.NumPy

Dizinin ikinci eksenindeki tüm diğer öğeleri kaldırmaya çalışıyorum. Bunu MATLAB'da arr(:,:,2:2:end) = []; ile yaptım, ancak Python'da aynısını yapmaya çalıştığımda ve iki çıkışı karşılaştırdığımda farklı bir matris elde ettim.

arr = np.delete(arr,np.arange(0,arr.shape[2],2),2) ve arr = arr[:,:,1::2]'u denedim, ancak MATLAB ile aldığım bir şeyle karşılaşmadım.



Örnek:

MATLAB

disp(['before: ',str(arr[21,32,11])]) 
    arr(:,:,2:2:end) = []; 
    disp(['after: ',str(arr[21,32,11])]) 

çıkışı:

before: 99089 
    after: 65699 


Python

print 'before: ' + str(arr[20,31,10]) 
    arr = arr[:,:,1::2] # same output as np.delete(arr,np.arange(0,arr.shape[2],2),2) 
    print 'after: ' + str(arr[20,31,10]) 

çıktı: Ben temel bir şey bakan değilim umut

before: 99089 
    after: 62360 

.

+1

Sadece 'arr = arr [:,:, :: 2] '? – Divakar

+0

@Divakar Tamam, bu gerçekten her şeyi düzeltti. “:: 2” nin neden 1: 2'den farklı çalıştığını açıklıyor musunuz? – David

+1

Eh '[1 :: 2]' '[1]' i '' '' '' '' '' '' '' '' '' '' 'den itibaren indekslemeyi başlatır, ancak '' '' '' ''}' 'öğesinden sonra istediğinizi seçin. Yani, alternatif olarak, aynı şeyi ve etkiyi ifade etmek için 'arr = arr [:,:, 0 :: 2]' yapabilirsiniz. – Divakar

cevap

4

İkinci öğeden başlayarak son eksende başlayan diğer tüm öğeleri silmeye çalışıyorsunuz. Diğer bir deyişle, ilk elemeden başlayarak diğer elementleri bu eksende tutmaya çalışıyorsunuz.

Böylece elemanlar seçme yerine elemanlarını silme etrafında başka bir yol çalışma, MATLAB kodu arr(:,:,2:2:end) = [] (performans numaralarını ihmal) eşdeğer olacaktır: Python/numpy yılında

arr = arr(:,:,1:2:end) 

, bu olur be: basitçe

arr = arr[:,:,0::2] 

Veya:

arr = arr[:,:,::2] 
+0

Ah, şimdi mükemmel bir anlam ifade ediyor! Açıklamak için zaman ayırdığınız için teşekkür ederim :) – David

+0

@David Awesome, kool! – Divakar