2012-07-17 7 views
43

En az çalışan bir örnek için, bir 2D dizisini dijital hale getirelim. Şimdi documentation saysNumPy'nin bir görünüm veya kopya oluşturup oluşturmadığını nasıl anlarım?

import numpy as np 
N = 200 
A = np.random.random((N, N)) 
X = np.linspace(0, 1, 20) 
print np.digitize(A.ravel(), X).reshape((N, N)) 

:: Gerekirse

... bir kopyası yalnızca yapılır numpy.digitize bir 1D dizi gerektiriyor.

ravel kopyasının bu durumda "gerekli" olup olmadığını nasıl anlarım? Genel olarak - belirli bir işlemin bir kopya mı yoksa bir görünüm oluşturduğunu belirleyebileceğim bir yol var mı?

+0

Kopyalamayı zorlamak istiyorsanız, bulduğum en iyi şey np.copy veya np.array işlevini kullanmaktır: tr = np.array (aT, copy = True) ' –

cevap

45

Bu soru bir süre geri istedi question çok benzer: Sen base niteliğini kontrol edebilirsiniz

. Bununla birlikte, bu mükemmel değildir. Bununla birlikte, bu mükemmel değildir. np.may_share_memory'u kullanarak belleği paylaşıp paylaşmadıklarını kontrol edebilirsiniz.

print (b.flags['OWNDATA']) #False -- apparently this is a view 
e = np.ravel(b[:, 2]) 
print (e.flags['OWNDATA']) #True -- Apparently this is a new numpy object. 

Ama oldukça neden ...

benim parmak koyamazsınız rağmen bu sonuncusu, bana biraz şüpheli görünüyor: var

print (np.may_share_memory(a, b)) 

da bayraklar kontrol edebilirsiniz o özellik bir görünüm yapılamaz eğer reshape için belgelerde

+0

İlginç, bağlantılarınız için teşekkürler cevaplarına. “Paylaşım” ile “paylaşma” farklı (ve bir aramada ortaya çıkmadı) ifadesiyle sorumu bırakacağım. – Hooked

+0

@Hooked - Evet, bu, soruyu bir kopya olarak işaretlemek yerine (başkalarının ne düşüneceğini bilmiyorum) cevaplamak için yeterince farklı. Neyse, umarım bu yardımcı olur. – mgilson

+1

Sadece bazılarını denedim ve 'flag ['OWNDATA']' kullanarak bazı durumlarda kesinlikle başarısız olabilir. Örneğinizde, 'ravel' yerine' e = np.reshape (b [:, 2], -1) 'seçeneğini kullanırsanız, bir kopya yapılmış olsa bile, bayraklar ['OWNDATA']' False olur. – amicitas

14

istisna sağlamak konusunda bazı bilgiler vardır:

Veriyi kopyalamadan bir dizinin şeklini değiştirmek her zaman mümkün değildir.

>>> a = np.zeros((10, 2)) 
# A transpose make the array non-contiguous 
>>> b = a.T 
# Taking a view makes it possible to modify the shape without modiying the 
# initial object. 
>>> c = b.view() 
>>> c.shape = (20) 
AttributeError: incompatible shape for a non-contiguous array 



Bu tam Sorunuza bir cevap değildir: bir hata veri kopyalanmış ise yetiştirilmek üzere isterseniz, dizinin şekli özniteliği yeni bir şekil atamak gerekir Ancak bazı durumlarda bu sadece yararlı olabilir.