2017-03-14 3 views
3

Gibt es eine optimale Möglichkeit, jede Zeile einer Matrix in Numpy (oder Theano) durch einen Schritt von N, gegebenen Startindex für jede Spalte zu schneiden?Slice-Matrix in Numpy (oder Theano)

beispielsweise in der Matrix A unten für jede Zeile beginnend slice Index wird in der ersten Spalte angegeben, und die für eine Zeile i, möchte ich A[i, A[0]:A[0]+stride]

A = [[1, 1, 2, 3, 4, 5, 6], 
    [1, 11, 12, 13, 14, 15, 16], 
    [3, 22, 23, 24, 25, 26, 27]] 
stride = 2 
Desired output: 
[[ 1. 2. 3.] 
[ 11. 12. 13.] 
[ 24. 25. 26.]] 

I den Code versucht haben:

b = [range(A.shape[0]), A[:, 0]] 
c = [range(A.shape[0]), A[:, 0] + stride] 
A[b:c] 

aber ich habe den folgenden Fehler:

IndexError: failed to coerce slice entry of type list to integer 
+0

der Fehler bedeutet, daß das 'b: c ' Die Slice-Notation arbeitet mit Ganzzahlen, nicht mit Listen. Sie müssen also entweder jede Zeile trennen und sie verbinden oder ein Indexierungs-Array erstellen, das auf das gesamte Array gleichzeitig wirkt. – hpaulj

Antwort

1

hier ein vektorisiert Ansatz Verwendung von broadcasting machen über jede Reihe, diese Indizes für die Indizierung in Spalten zu bekommen und dann NumPy's advanced-indexing mit zu die Elemente entlang jeder Zeile in einer vektorisierten Weise extrahieren -

idx = A[:,0,None] + np.arange(stride+1) 
out = A[np.arange(idx.shape[0])[:,None], idx] 

Probelauf -

In [273]: A 
Out[273]: 
array([[ 1, 1, 2, 3, 4, 5, 6], 
     [ 1, 11, 12, 13, 14, 15, 16], 
     [ 3, 22, 23, 24, 25, 26, 27]]) 

In [274]: idx = A[:,0,None] + np.arange(stride+1) 

In [275]: idx 
Out[275]: 
array([[1, 2, 3], 
     [1, 2, 3], 
     [3, 4, 5]]) 

In [276]: A[np.arange(idx.shape[0])[:,None], idx] 
Out[276]: 
array([[ 1, 2, 3], 
     [11, 12, 13], 
     [24, 25, 26]]) 
0

Nicht sicher, ob es optimal ist, aber zumindest hat es keine Fehler werfen :)

Python 2.7.12 (default, Nov 19 2016, 06:48:10) 
[GCC 5.4.0 20160609] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import numpy 
>>> a = numpy.array([[1, 1, 2, 3, 4, 5, 6], 
...     [1, 11, 12, 13, 14, 15, 16], 
...     [3, 22, 23, 24, 25, 26, 27]]) 
>>> stride = 2 
>>> numpy.array(map(lambda row: row[row[0]:row[0] + stride + 1], a)) 
array([[ 1, 2, 3], 
     [11, 12, 13], 
     [24, 25, 26]])