Schneiden von Arrays mit Listen

8

Also erstelle ich ein numpy Array:

a = np.arange(25).reshape(5,5)

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, 24]])

Ein herkömmliches Slice a[1:3,1:3]kehrt zurück

Array ([[6, 7], [11, 12]])

ebenso wie die Verwendung einer Liste in der zweiten a[1:3,[1,2]]

Array ([[6, 7], [11, 12]])

Gibt jedoch a[[1,2],[1,2]]zurück

Array ([6, 12])

Offensichtlich verstehe ich hier etwas nicht. Das Schneiden mit einer Liste kann jedoch gelegentlich sehr nützlich sein.

Prost,

keng

keng
quelle
Soll a[[1,2],[1,2]]sagen a[[1:2],[1:2]]? Gibt es einen Tippfehler a[1:3,[1,2]]? Oder verstehe ich falsch?
SherylHohman

Antworten:

2

Sie haben den Effekt der sogenannten erweiterten Indizierung beobachtet . Betrachten wir ein Beispiel aus dem Link:

import numpy as np
x = np.array([[1, 2], [3, 4], [5, 6]])
print(x)
[[1 2]
 [3 4]
 [5 6]]
print(x[[0, 1, 2], [0, 1, 0]])  # [1 4 5]

Sie können dies als Bereitstellung von Listen mit (kartesischen) Gitterkoordinaten betrachten, z

print(x[0,1])  # 1
print(x[1,1])  # 4
print(x[2,0])  # 5
Daweo
quelle
0

Im letzten Fall werden die beiden einzelnen Listen als separate Indexierungsvorgänge behandelt (dies ist eine sehr umständliche Formulierung, bitte nehmen Sie Kontakt mit mir auf).

Numpy sieht zwei Listen mit zwei ganzen Zahlen und entscheidet, dass Sie daher nach zwei Werten fragen. Der Zeilenindex jedes Werts stammt aus der ersten Liste, während der Spaltenindex jedes Werts aus der zweiten Liste stammt. Deshalb bekommst du a[1,1]und a[2,2]. Die :Notation erweitert sich nicht nur auf die Liste, die Sie genau abgeleitet haben, sondern teilt numpy auch mit, dass Sie alle Zeilen / Spalten in diesem Bereich haben möchten.

Wenn Sie manuell kuratierte Listenindizes bereitstellen, müssen diese dieselbe Größe haben, da die Größe jeder Liste der Anzahl der Elemente entspricht, die Sie zurückerhalten. Wenn Sie beispielsweise die Elemente in den Spalten 1 und 2 der Zeilen 1,2,3 möchten:

>>> a[1:4,[1,2]]
array([[ 6,  7],
       [11, 12],
       [16, 17]])

Aber

>>> a[[1,2,3],[1,2]]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (3,) (2,)

Die ehemalige sagt numpy , dass Sie eine Reihe von Zeilen und Spalten spezifischer wollen, während die letzteren sagt „hol mir die Elemente an (1,1), (2,2)und (3, hey! what the?! where's the other index?)

inspectorG4dget
quelle
0

a[[1,2],[1,2]]liest dies als, ich möchte ein [1,1] und ein [2,2]. Es gibt ein paar Möglichkeiten, dies zu umgehen, und ich habe wahrscheinlich nicht einmal die besten Möglichkeiten, aber Sie könnten es versuchen

a[[1,1,2,2],[1,2,1,2]]

Dadurch erhalten Sie eine abgeflachte Version von oben

a[[1,2]][:,[1,2]]

Dadurch erhalten Sie das richtige Slice. Es werden die Zeilen [1,2] und dann die Spalten [1,2] verwendet.

cmxu
quelle
0

Es löst eine erweiterte Indizierung aus, sodass der erste Slice der Zeilenindex und der zweite der Spaltenindex ist. Für jede Zeile wird die entsprechende Spalte ausgewählt.

a[[1,2], [1,2]] -> [a[1, 1], a[2, 2]] -> [6, 12]
Ferhat Elmas
quelle