2014-07-08 28 views
6

Belirli bir numpy dizilim ve bir dizi dilim nesnesi içeren bir liste (alternatif olarak (start, end) kopyalar içeren). Dilim nesnesi konumlarını orijinal diziden kaldırmaya ve kalan değerleri içeren ikinci bir dizi almaya çalışıyorum.Bir numpy dizisinden birden çok dilim silme

Oyuncak örnek:

myarray = np.arange(20) 

array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 
     17, 18, 19]) 

mylist=(slice(2,4),slice(15,19)) 

şeyler yapın ve sonuç

array([0, 1, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]) 

dizi dilim nesnelerinin listesini birkaç bin unsurları içerebilir birkaç yüz bin büyük olabilir olmalı ve Operasyonu sık sık çalıştırmam gerekiyor, bu yüzden hız biraz önemlidir.

Numpy silme, görebildiğim kadar dilim listesi almıyor mu?

Şu anda dilim nesne listemi tamamlıyor ve dilimleme yapıyorum, ancak tamamlayıcıyı oluşturmak, dilim listenizi sıraladığım ve ardından yineleme dilim nesnelerini gerektiği şekilde oluşturduğum, biraz garip bir süreçtir. Umduğum daha zarif bir yol olduğunu umuyorum!

cevap

1
Sen pozisyonları tutulacak olduğunu belirlemek için set() kullanabilirsiniz

ve np.take() böyle bir şey yaptığını, ilgili değerleri elde etmek için: Tüm endeksleri ile tek bir dizi elde etmek için kullanılır

ind = np.indices(myarray.shape)[0] 
rm = np.hstack([ind[i] for i in mylist]) 

ans = np.take(myarray, sorted(set(ind)-set(rm))) 

Not np.hstack() o olacak kaldırılmalıdır. Bu, HYRY'nin çözümünün yaklaşık yarısını alır.

+1

Bu harika çalıştı, şerefe! – anordell

1

Dilimlere düzgün bir şekilde katılmanın bir yolunu düşünemiyorum; Ancak, kompozit kullanarak gitmek için yol olduğunu düşünüyorum.

import numpy as np 

# Create test data 
n_data = 1000000 
n_slices = 10000 

data = np.arange(n_data) 
slices = [] 
for i in range(n_slices): 
    r = np.random.randint(n_data-1000) 
    slices.append(slice(r,r + np.random.randint(1000))) 

# Remove slices 
keep_mask = np.ones_like(data, dtype=bool) 
for slice in slices: keep_mask[slice] = False 
data = data[keep_mask] # or np.take, etc. 
1

Sen bir diziye dilim katılmak için np.r_[] kullanabilirsiniz::

myarray = np.arange(20) 
mylist=(slice(2, 4),slice(15, 19)) 
np.delete(myarray, np.r_[tuple(mylist)]) 

çıkışı:

array([ 0, 1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 19]) 

Ama çok hızlı olmadığını düşünüyorum Belki de böyle bir şey deneyin.

İlgili konular