2016-04-03 10 views
1

Bir sayının sahip olabileceği belirli bir Numpy dizisinin ilk (sıfırıncı) öğesine hızlıca erişmek istediğim bir işlev var. Bunu yapmanın en hızlı yolu nedir?Numpy dizisindeki ilk öğeye, rastgele boyut sayısı ile erişmenin hızlı yolu?

Şu anda aşağıdaki kullanıyorum:

a.reshape(-1)[0] 

Bu 1D diziye belki-çok-dimensionsal dizi yeniden şekillendirilmiştir ve genellikle hızlı, kısa tatlı ve bir sıfırıncı eleman, yakalar. Bununla birlikte, bunun bazı dizilerle zayıf bir şekilde çalışacağını düşünüyorum, örneğin, büyük bir dizinin aktarılmış bir görünümü olan bir dizi, endişe ettiğim için, bu durumun, orijinal dizinin sadece bir başka görünümü yerine bir kopya oluşturmaya ihtiyaç duyacağına inanıyorum. her şeyi doğru sırayla almak için. (Bu doğru mu? Yoksa gereksiz yere endişeleniyor muyum?) Ne olursa olsun, gerçekten ihtiyacım olandan daha fazla iş yapıyor gibi geliyor, bu yüzden bazılarınızın bunu yapmanın genellikle daha hızlı bir yolunu bildiğini düşünüyorum.

Göz önünde bulundurduğum diğer seçenekler, tüm dizi üzerinde bir yineleyici oluşturmak ve ondan yalnızca bir öğe çizmek veya her bir boyut için bir sıfır içeren bir sıfır oluşturmak ve bunu diziye fantezi dizinine eklemek. Ama bunların hiçbiri de bu kadar güzel değil.

+1

* "Yoksa gereksiz yere endişeleniyorum mu?" * Hayır, gereksiz yere endişelenmiyorsunuz! 'A'nın belleğinin düzenine bağlı olarak, a.reshape (-1)' bir kopyaya neden olabilir; bu, önem verdiğiniz tek şey ilk öğe olduğunda kesinlikle fazladır. –

cevap

4
a.flat[0] 

Bu, oldukça hızlı olmalı ve asla bir kopyasını gerektirmez. (Not a.flat, bir dizi değil numpy.flatiter örneğidir.)

2

a.item(0); numpy.ndarray.item adresindeki belgelere bakın.

Bu yaklaşımın olası bir dezavantajı, dönüş değeri, bir numpy nesnesi değil, Python veri tipidir. Örneğin, a, numpy.uint8 veri tipine sahipse, a.item(0) bir Python tamsayı olacaktır. Bu bir sorunsa, a.flat[0] daha iyidir - @ user2357112'nin cevabına bakın.

İlgili konular