2014-01-25 11 views
6

Ich bin mir ziemlich sicher, dass ich etwas mit ganzzahliger Indizierung vermisse und könnte etwas Hilfe verwenden. Sagen, dass ich einen 2D-Array zu erstellen:Numpy Array Integer-Indizierung in mehr als einer Dimension

>>> import numpy as np 
>>> x=np.array(range(24)).reshape((4,6)) 
>>> x 
array([[ 0, 1, 2, 3, 4, 5], 
     [ 6, 7, 8, 9, 10, 11], 
     [12, 13, 14, 15, 16, 17], 
     [18, 19, 20, 21, 22, 23]]) 

I kann dann wählen, Reihe 1 und 2 mit:

>>> x[[1,2],:] 
array([[ 6, 7, 8, 9, 10, 11], 
     [12, 13, 14, 15, 16, 17]]) 

oder die Spalte 1 der Zeilen 2 und 3 mit:

>>> x[[1,2],1] 
array([ 7, 13]) 

Es würde also für mich Sinn machen, dass ich damit die Spalten 3, 4 und 5 der Zeilen 1 und 2 auswählen kann:

>>> x[[1,2],[3,4,5]] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: shape mismatch: objects cannot be broadcast to a single shape 

Und stattdessen muss ich es in zwei Schritten vor:

>>> a=x[[1,2],:] 
>>> a 
array([[ 6, 7, 8, 9, 10, 11], 
     [12, 13, 14, 15, 16, 17]]) 
>>> a[:,[3,4,5]] 
array([[ 9, 10, 11], 
     [15, 16, 17]]) 

von R kommend, meine Erwartungen scheinen falsch zu sein. Können Sie bestätigen, dass dies in einem Schritt nicht möglich ist oder eine bessere Alternative vorschlagen? Vielen Dank!

BEARBEITEN: Bitte beachten Sie, dass meine Auswahl der Zeilen und Spalten im Beispiel konsekutiv ist, aber das muss nicht sein. Mit anderen Worten, die Indizierung von Schnitten reicht für meinen Fall nicht aus.

Antwort

3

Sie haben auch die Möglichkeit, Rundfunk unter den Indizierungs Arrays zu verwenden, was was ist, würde ich es normalerweise tun, anstatt Indizierung zweimal, die eine Zwischenkopie der Daten erstellt:

>>> x[[[1], [2]],[[3, 4, 5]]] 
array([[ 9, 10, 11], 
     [15, 16, 17]]) 

um ein wenig besser zu sehen, was los ist und wie eine größere Anzahl von Indizes zu handhaben:

>>> row_idx = np.array([1, 2]) 
>>> col_idx = np.array([3, 4, 5]) 
>>> x[row_idx.reshape(-1, 1), col_idx] 
array([[ 9, 10, 11], 
     [15, 16, 17]]) 
+0

Richtig Sie sind, dass Zwischenkopie mich wirklich nervte. Thans viel! – Miquel

+0

nett; Ich war mir dessen nicht bewusst! –

+1

Ich verirre mich in Klammern Treibsand ... –

2

Etwas wie folgt aus:

In [28]: x[1:3, 3:6]                    
Out[28]: 
array([[ 9, 10, 11], 
     [15, 16, 17]]) 
+0

Danke! Ich muss jedoch mit einem Indexarray anstelle eines Slices indexieren. Mit anderen Worten, die Zeilen und Spalten sind möglicherweise nicht aufeinanderfolgend oder in der Reihenfolge – Miquel

+1

@ Miquel Ich denke nicht, dass es möglich ist, Indexierung auf mehrdimensionalen Array auf diese Weise zu tun. Lesen Sie: http://docs.scipy.org/doc/numpy/user/basics.indexing.html#indexing-multi-dimensional-arrays –

Verwandte Themen