2010-12-06 10 views
77

2B numpy dizilim var. İlk k satır ve tüm sütunları içerecek bir görünüm oluşturmak için bir yolu var mı?Sayısal bir dizinin üzerine mi bakıyorsunuz?

noktası Temel verileri kopyalama kaçınmaktır (dizi kısmi kopyalarını yapmak mümkün değildir o kadar büyüktür ki.) Olarak

cevap

188

Tabii, sadece indeks o zamanki. Örneğin. y = x[:k, :] Bu, orijinal diziye bir görünüm döndürecektir. Hiçbir veri kopyalanmayacak ve y'a yapılan tüm güncellemeler x'a ve tersine yansıtılacaktır.


Düzenleme:

Ben sık uint8 yılların> 10GB 3D diziler ile çalışmak, bu yüzden aklınızda bir kaç şey tutarsanız ... Numpy bellek yönetimi çok verimli olabilir bu konuda çok endişelenmenize

.

vb Kullanım +=, -=, *=, dizinin bir kopyasını yapmaktan kaçınmaya: Burada bellekte Dizilerin yapma kopyalarını kaçınarak birkaç ipucu. Örneğin. x += 10 diziyi yerinde değiştirecek, x = x + 10 ise bir kopya oluşturacak ve değiştirecektir. Eğer x = x + 10 bir kopyasını yapmak istiyorum yoksa x = x + 10.0 otomatik durumda değilse, bir kayan noktalı diziye döküm yukarı olmak x neden olacağını unutmayın,

(ayrıca, numexpr de bakabilirsiniz). Ancak, x bir tamsayı dizisi olan x += 10.0, bunun yerine 10.0 dizisinin, diziyle aynı kesinlikteki bir dizeye indirgenmesine neden olur.

Ayrıca, birçok numpy işlevi out parametresini alır, böylece np.abs(x, x) gibi öğeleri x mutlak değerini yerinde yapmak için yapabilirsiniz.

piton listeleri aksine, y = x[:] bir kopyasını dönmez, bir görünüm verir: İkinci bir düzenleme olarak


, burada görünümleri kopya numpy diziler vs üzerinde birkaç ipucu daha var. Bir kopyasını (tabii ki, kullandığınız bellek miktarını ikiye katlayacak şekilde) kullanmak istiyorsanız, y = x.copy()

Sayısal dizilerin "fantezi indekslenmesi" hakkında sıkça söz duyarsınız. Dizin olarak bir liste (veya tamsayı dizisi) kullanmak "fantezi dizinleme" dir. Çok kullanışlı olabilir, ancak verileri kopyalar.

Buna bir örnek olarak: y = x[[0, 1, 2], :] bir kopyası döndürürken, y = x[:3,:] bir görünüm döndürür.

x[4:100:5, :-10:-1, None] gibi gerçekten çılgın dizinler bile "normal" indeksleme işlemidir ve bir görünüm döndürür, bu nedenle büyük dizilerde her türlü dilimleme püf noktasını kullanmaktan korkmayın.

x.astype(<dtype>), verilerin bir kopyasını yeni tür olarak döndürür; x.view(<dtype>) ise görünüm döndürür.

Bununla ilgili olarak dikkatli olun ... Son derece güçlü ve kullanışlı, ancak temel verilerin bellekte nasıl saklandığını anlamanız gerekir.Bir dizi floatınız varsa ve bunları ints olarak görüntülerseniz (veya tersi), numpy dizinin altında yatan bits değerini ints olarak yorumlar. Örneğin

, bir 64 bit int bakıldığında ve [ 0, 0, 0, 0, 0, 0, 240, 63] bir dizi, bir Uint8 olarak bakıldığında bir küçük endian sistemi üzerinde bir 64-bit float olarak 1.04607182418800017408 olacağı anlamına gelir. Büyük dizilerde biraz sıralama yapmak gerektiğinde bu gerçekten çok güzel ... Bellek arabelleğinin nasıl yorumlandığına dair düşük seviye kontrolünüz var.

+0

Çok güzel ipuçları için teşekkürler! Numpy kullanım kılavuzunu okuyordum ve neden x [np.array ([1, 1, 3, 1])] + = 1 = x değiştirildiğini karıştırıyordum. Şimdi anladım! – tnq177

+0

Bu harika bir cevap, paylaşım için teşekkürler. – jlandercy

+0

güzel ipuçları! Başka bir sorum daha var. Bu yazımın bir kopyasını değil, yalnızca bir görüntüsünü tetiklemesi nasıl kanıtlanır? python'un id() 'i bu kadar yeteneksiz görünüyor. – wuhaochi

İlgili konular