2014-04-23 19 views
11

Ben bu şekilde bir dizi resize kullanmaya çalıştı:Numpy, dizinin kendi verileri yok mu?

a = np.array([1,2,3,4,5,6], dtype=np.uint8) 
a.resize(4,2) 
print a 

ve çıkış Tamam (Ben hiçbir hata olduğu anlamına geliyordu)!. Bu kodu çalıştırdığınızda Ama:

a = np.array([1,2,3,4,5,6], dtype=np.uint8).reshape(2,3) 
a.resize(4,2) 
print a 

o söyleyerek, bir hata yol açtı,

ValueError: cannot resize this array: it does not own its data Sorum: neden reshape dizinin sahipliğini uygulandıktan sonra değiştirilir? Mülkiyet kime verilir! reshape, yeni bir bellek oluşturmaz ve aynı dizi belleğinde çalışmasını gerçekleştirir! Peki sahiplik neden değişecek?

np.reshape ve ndarray.resize belgelerini okudum ama nedenini anlayamıyorum. this post'u okudum. resize yöntemini uygulamadan önce her zaman ndarray.flags'u kontrol edebilirim.

cevap

11

aşağıdaki başlayalım:

>>> a = np.array([1,2,3,4,5,6], dtype=np.uint8) 
>>> b = a.reshape(2,3) 
>>> b[0,0] = 5 
>>> a 
array([5, 2, 3, 4, 5, 6], dtype=uint8) 

O dizi b kendi dizi değil, sadece a bir görünüm (sadece başka bir şekilde "OWNDATA" bayrağını anlamak için) burada görebilirsiniz. Basitçe hem a hem de b belirtmek için aynı verileri belleğe başvurur, ancak b, a'u farklı bir biçimde görüntülüyor.

başvuru sayısı kontrolünün amacı yapmaktır: b bu resize tanımından olarak caiz değildir a sadece bir görünümüdür olarak çağrılması ndarray.resize gibi resize fonksiyonu yerine yılında diziyi değiştirmeye çalışırsa Bu diziyi başka bir Python nesnesi için arabellek olarak kullanmadığınızdan ve belleği yeniden tahsis ettiğinizden emin olun.


senin sorunu aşmak için size Numpy gelen resize çağırabilir (bir ndarray bir niteliği olarak) bu sorunu algılar ve otomatik olarak veri kopyalamak olacaktır:

>>> np.resize(b,(4,2)) 
array([[5, 2], 
     [3, 4], 
     [5, 6], 
     [5, 2]], dtype=uint8) 

Edit: CT gibi Zhu, np.resize ve ndarray.resize verilerini iki farklı şekilde doğru şekilde eklemektedir. ndarray.resize olarak beklenen davranışı yeniden oluşturmak için aşağıdakileri yapmanız gerekir:

>>> c = b.copy() 
>>> c.resize(4,2) 
>>> c 
array([[5, 2], 
     [3, 4], 
     [5, 6], 
     [0, 0]], dtype=uint8) 
+0

'a = np.array ([1,2,3,4,5,6], d_type = np.uint8)' bu iki farklı sonuç verir: np.resize (a, (4,2)) 'a.resize (4,2), a 'yazdırın. Bu, –

+0

@ CTZhu'nun iyi bir yönü değildir. İyi bir nokta, şekli iki farklı şekilde artırır. – Daniel

+3

Başka bir yol, dizinin 'shape' özniteliğini değiştirmek. (ör., a.shape = (2, 3) ') Bu, yeni bir görünüm oluşturmadan yerinde yeniden şekillendirir. –