2016-03-30 3 views
1

, bir Numpy dizi olduğunu varsayalım bile uzunluğunun eksene sahiptir çünkü Numpy dizisinde orta dört öğeye erişmenin en hızlı yolu?

rand = np.random.randn(6, 6) 

gibi

I dizi merkezi dört değer gerekir. Eğer 5, 5 gibi tuhaf olsaydı, o zaman sadece tek bir merkezi değer olurdu. Bu dört girişi almanın en basit/en hızlı/en kolay yolu nedir? Onları endekslerle çok kaba bir şekilde elde edebilirim, fakat bir grup fonksiyonu çağırıp bir dizi hesaplamayı yapmaktan daha hızlı bir yol arıyorum. hatta hatta tarafından ise, bunu istiyorum -

array([[1.00016061, -0.70389486], 
     [-0.63757421, 1.70390504]]) 

Ama sadece 4 4 ​​ile dizide için değil:

array([[ 0.25659355, -0.75456113, 0.39467396, 0.50805361], 
     [-0.77218172, 1.00016061, -0.70389486, 1.67632146], 
     [-0.41106158, -0.63757421, 1.70390504, -0.79073362], 
     [-0.2016959 , 0.55316318, -1.55280823, 0.45740193]]) 

Aşağıdaki istiyorum:

Örneğin

, aşağıdakileri dikkate Yukarıdaki gibi dört merkezi eleman.

+1

Soruyu anladığımdan emin değilim. 'Rand [1: 5,1: 5] 'yi kullanamaz mısın? –

cevap

4

Böyle bir şey çok mu karmaşık?

def get_middle(arr): 
    n = arr.shape[0]/2.0 
    n_int = int(n) 
    if n % 2 == 1: 
     return arr[[n_int], [n_int]] 
    else: 
     return arr[n_int:n_int + 2, n_int:n_int + 2] 
+0

Hayır, bu mantıklı, ama dediğim gibi, aynı şeyi yapabilirim - bir grup hesaplama ve çağrı fonksiyonu ile. Daha hızlı bir yolu var mı? – bjd2385

+0

Sanırım bu işe yarayacak. cevap verdiğiniz için teşekkürler! – bjd2385

+0

Sanırım arka planda başka bir yol aynı kodu çağırıyor. Bu kodu saklı tutabilir, arayabilir ve yüzey uygulamasını unutabilirsiniz! – Jules

3

Tek bir dilimleme işlemi ile yapabilirsiniz: Ben parens dışarı bırakarak işlemlerin sırasını kötüye ediyorum

rand = np.random.randn(n,n) 
# assuming n is even 
center = rand[n/2-1:n/2+1, n/2-1:n/2+1] 

, sadece biraz daha az dağınık hale getirmek için.

1

Verilen dizisi:

import numpy as np 
a = np.array([[ 0.25659355, -0.75456113, 0.39467396, 0.50805361], 
[-0.77218172, 1.00016061, -0.70389486, 1.67632146], 
[-0.41106158, -0.63757421, 1.70390504, -0.79073362], 
[-0.2016959 , 0.55316318, -1.55280823, 0.45740193]]) 

merkezi 4 değerlerini almanın en kolay yolu şudur: dizinin boyutları için bile sayılar varsa

ax, ay = a.shape 
a[int(ax/2)-1:int(ax/2)+1, int(ay/2)-1:int(ay/2)+1] 

Bu işleri . Tek sayı durumunda, merkezi 4 değer olmayacaktır.