2015-09-24 20 views
7

2d dizisinden satır/sütun dilimleme ve (col_size x 1) veya (1 x row_size) bir dizi elde etmek için düzgün bir küçük numara bulmaya çalışıyorum.Numpy - diziden 2d satırı veya sütun vektörü dilimleme

Her dilimlemeden sonra numpy.reshape()'u kullanmanın daha kolay bir yolu var mı?

Alkış, Stephan

+0

Beklenen girdi ve çıktıya dair bir örnek verebilir misiniz? 1D dizi veya 2D dizi elde etmek ister misiniz? –

+0

Elbette! Diyelim ki np.ones ((2,40)) 'gibi bir dizim var. Bu diziden tam bir satır bir np.array ((1,40)) 'şeklinde dilimlemek istiyorum. Sonuç bir 2d dizisi olmalıdır – neurotronix

+1

np.newaxis kullan veya Yok –

cevap

11

Sen dilim ve bir tek operasyonda yeni bir eksen ekleyebilirsiniz.

>>> a[:, 1, None] 
array([[2], 
     [5]]) 

dışarı dilim için:

>>> a = np.arange(1, 7).reshape(2, 3) 
>>> a 
array([[1, 2, 3], 
     [4, 5, 6]]) 

üçüncü boyut olarak None ile, dilim tek kolon (şekil (2, 1) arasında dönen bir dizi) üzerinden dilim için: Örneğin, burada bir 2D dizisidir

>>> a[0, None, :] 
array([[1, 2, 3]]) 
: tek satır (şekil (1, 3) geri dönen dizisi), ikinci boyut olarak None ile dilim
+0

Yeni bir eksen eklemek için Çok teşekkürler! Tam ihtiyacım olan şey! Numpy gerçekten harika ve hızlı ve hepsi çok ama sezgisel değil, en azından benim için. – neurotronix

+1

Sorun değil! Endeksleme/yeniden şekillendirme, kafanızı sarmak için biraz zaman alır (en azından benim için yapar), ama biraz pratik yaptıktan sonra mantıklıdır. [Docs] (http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html), burada neler olduğunu açıklamak için oldukça iyidir (* temel dilimleme * bölümü). –

+0

Merakla indekslemeyi "Yok" ilavesiyle birleştirmeyi asla düşünmedim. Var olan bir dizinin boyutlarını genişletmek için 'Yok'u kullanarak sadece alışkanlık gücü olduğunu düşünüyorum. Ve daha hızlı. – hpaulj

6

endeksi bir dilim, liste veya dizi

X[[0],:] 
    X[0:1,4] 

olun Ama yazar, olması dışında reshape ile yanlış bir şey yok. Bu yavaş değil. [None,:] bunun için iyi bir kısa eldir.

bir liste indeksi kullanımı en kısa olabilir, ama bir kopyasını (artı veya eksi?) Üretmek yapar ve bir (100,100) tamsayı dizisi için

yavaş: kopyası için

In [487]: timeit x[[50],:] 
100000 loops, best of 3: 10.3 µs per loop # slowest 

In [488]: timeit x[50:51,:] 
100000 loops, best of 3: 2.24 µs per loop # slice indexing is fast 

In [489]: timeit x[50,:].reshape(1,-1) 
100000 loops, best of 3: 3.29 µs per loop # minimal time penalty 

In [490]: timeit x[50,:][None,:] 
100000 loops, best of 3: 3.55 µs per loop 

In [543]: timeit x[None,50,:]   # **best** 
1000000 loops, best of 3: 1.76 µs per loop 

Bir testte veri arabelleği işaretçisini orijinal ile karşılaştırmaktır.

In [492]: x.__array_interface__['data'] 
Out[492]: (175920456, False) 
In [493]: x[50,:].__array_interface__['data'] 
Out[493]: (175940456, False) 
In [494]: x[[50],:].__array_interface__['data'] 
Out[494]: (175871672, False) # different pointer 
In [495]: x[50:51,:].__array_interface__['data'] 
Out[495]: (175940456, False) 
In [496]: x[50,:][None,:].__array_interface__['data'] 
Out[496]: (175940456, False) 
+0

Teşekkür ederim dostum! – neurotronix

+0

Sorun şu ki, ölçek boyutları açısından ölçeklenebilir, ölçeklenebilir bir sinir ağı uyguluyorum. Yeniden şekillendirmek ile çok sık farklı örnek özniteliklerine (ör. Katman boyutları) erişmem gerekiyordu. Nihayet doğru olması için: 'a [0, Yok,:]' yi 'array' a'dan bir satır dilimlemek için kullanıyorum, o zaman bir kopyasını döndürecek mi? – neurotronix

+1

'[0, Yok,:]' bir görünümü döndürür. – hpaulj

1

Bu güzel ve kolay bir şekilde nasıl olur?

In [73]: arr = (np.arange(5, 25)).reshape(5, 4) 

In [74]: arr 
Out[74]: 
array([[ 5, 6, 7, 8], 
     [ 9, 10, 11, 12], 
     [13, 14, 15, 16], 
     [17, 18, 19, 20], 
     [21, 22, 23, 24]]) 

# extract column 1 as a column vector 
In [79]: col1 = arr[:, [0]] 
In [80]: col1.shape 
Out[80]: (5, 1) 

In [81]: col1 
Out[81]: 
array([[ 5], 
     [ 9], 
     [13], 
     [17], 
     [21]]) 


# extract row 1 as a row vector 
In [82]: row1 = arr[[0], :] 

In [83]: row1.shape 
Out[83]: (1, 4) 

In [84]: row1 
Out[84]: array([[5, 6, 7, 8]]) 
+0

Temiz ve ayrıntılı cevap için teşekkür ederiz! Ancak, sorunun iki yaşından büyük olduğunu farketmediniz mi? Şerefe :) – neurotronix

+0

@neurotronix Bunu fark ettim. Her neyse, pedagojik nedenlerden dolayı, zaman hiç önemli değil;) – kmario23

+0

Çok doğru, cevap vermenin zaman ayırdığınız için teşekkürler! – neurotronix

İlgili konular