2016-04-11 8 views
0

Çözmem gereken bir problemim var ve iyi bir çözüm bulamıyorum.python numpy dizileri. Birden çok diziyi verimli bir şekilde nasıl kesilir?

Aşağılamak için 10x10'luk bir dizi var ve 3x3'ün "küçük dizileri" ni dilimlemek istiyorum.

array = np.arange(100).reshape((10,10)) 

patch = np.array(array[:3, :3] 

for n in range(3, 10, 3): 
    for m in range(3, 10, 3): 
     patch = numpy.append(patch, array[n:n+3, m:m+3] 

i temelde birinci dilim numpy dizi yama oluşturmak ve daha sonra diğer tüm dilimleri ekleyin: Şu anda ben bu şu şekilde yapmak. Bununla ilgili problem, korkunç bir şekilde yavaş olması ve dilbilgisel dilimleme fırsatlarının iyi bir şekilde kullanılmamasıdır. Çok daha büyük diziler için bunu yapmalıyım. Bunu nasıl daha verimli hale getirebileceğimi öneren var mı? 1000 teşekkürler!

+0

niçin 'yama' ekleniyor? Eğer yama bir dilim ise, yani patch = array [n: n + 3, m: m + 3] ',' patch'de değiştirilen herhangi bir değer 'array'de değiştirilecektir. Bu bir hafıza sorunu ise, [dask] (http://dask.pydata.org/en/latest/) –

+0

'u aramanızı öneririz ve cevabınız için teşekkür ederiz. Sonunda sahip olmak istediğim bir Büyük dizi dizisinde olası her 3x3 dilimi içeren dizi (yama). doğru boyutları (işimde daha fazla boyutlu diziler kullanıyorum) almak ve daha sonra tüm diğer dilimleri eklemek için bir giriş (dilim 1) ile dizi oluşturma çirkin bir şekilde bunu yapıyorum. Yaptığım şekilde sen de diziyi değiştirir misin? Bunu yapmak istemiyorum, dizi – idontknow

+0

yamasından bağımsız olmalıyım. Hala diziyi parçalara bölmek için neden görmedim, ya da diziyi değiştirmenin yamuk olmasının nedeni bu sorunun nedenidir. Ayrıca, ekseni ayarlama ekseni kullanarak 2d dizinizi 1d'ye çeviriyorum. Basit bir örnekle ne yapmak istediğinizi göstermeye çalışabilir misiniz? –

cevap

0

Sorununuz tamamen numpy.append kullanıyor. append, her kullandığınızda yeni bir dizi oluşturur. Yama diziniz büyüdükçe bu durum giderek daha uzun sürebilir. Bunun yerine, önceden tanımlı bir dizi kullanın (zaten yama dizisinin son boyutunu zaten biliyorsunuz) ve herhangi bir verinin ara kopyalarını yapmaktan kaçının. Üste |

# setup 
x, y = 999, 999 
array = np.arange(x * y) 
array.shape = x, y 
little_array_size = 3 

# creates an array of "little arrays" 
patch = np.empty(array.size, dtype=int) 
patch.shape = -1, little_array_size, little_array_size 

i = 0 
for n in range(0, array.shape[0], little_array_size): 
    for m in range(0, array.shape[1], little_array_size): 
     # uses view, so data is copied straight from array to patch 
     patch[i,:] = array[n:n+little_array_size, m:m+little_array_size] 
     i += 1 

patch.shape = -1 # flattens array 

yukarıda bilgisayarımda ikinci yaklaşık üçte sürer (büyüklük iki emir daha hızlı numpy.append (20+ saniye kullanmaktan daha)).

+0

ah, aradığım şey buydu. çok teşekkürler, yüzlerce kez daha hızlı çalıştım. – idontknow