Cortando matrices con listas

8

Entonces, creo una matriz numpy:

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

matriz ([[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]])

Un corte convencional a[1:3,1:3]vuelve

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

al igual que usar una lista en el segundo a[1:3,[1,2]]

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

Sin embargo, a[[1,2],[1,2]]vuelve

matriz ([6, 12])

Obviamente no estoy entendiendo algo aquí. Dicho esto, cortar una lista en ocasiones puede ser muy útil.

Salud,

keng

keng
fuente
Se a[[1,2],[1,2]]supone que debe decir a[[1:2],[1:2]]? ¿Hay un error tipográfico a[1:3,[1,2]]? ¿O estoy malentendido?
SherylHohman

Respuestas:

2

Usted observó el efecto de la denominada indexación avanzada . Consideremos el ejemplo del enlace:

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]

Puede pensar en esto como proporcionar listas de coordenadas (cartesianas) de la cuadrícula, como

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

En el último caso, las dos listas individuales se tratan como operaciones de indexación separadas (esta es una redacción realmente incómoda, así que tengan paciencia conmigo).

Numpy ve dos listas de dos enteros y decide que, por lo tanto, está solicitando dos valores. El índice de fila de cada valor proviene de la primera lista, mientras que el índice de columna de cada valor proviene de la segunda lista. Por lo tanto, obtienes a[1,1]y a[2,2]. La :notación no solo se expande a la lista que ha deducido con precisión, sino que también le dice a numpy que desea todas las filas / columnas en ese rango.

Si proporciona índices de lista seleccionados manualmente, deben ser del mismo tamaño, porque el tamaño de cada lista es el número de elementos que obtendrá. Por ejemplo, si desea los elementos en las columnas 1 y 2 de las filas 1,2,3:

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

Pero

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

El primero le dice numpy que desea un rango de filas y columnas específicas, mientras que el segundo dice "me consigue los elementos a (1,1), (2,2)y (3, hey! what the?! where's the other index?)"

inspectorG4dget
fuente
0

a[[1,2],[1,2]]está leyendo esto como, quiero un [1,1] y un [2,2]. Hay algunas maneras de evitar esto y probablemente ni siquiera tengo las mejores formas, pero podrías intentar

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

Esto le dará una versión aplanada de arriba

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

Esto le dará el corte correcto, funciona tomando las filas [1,2] y luego las columnas [1,2].

cmxu
fuente
0

Activa la indexación avanzada, por lo que el primer segmento es el índice de fila, el segundo es el índice de columna. Para cada fila, selecciona la columna correspondiente.

a[[1,2], [1,2]] -> [a[1, 1], a[2, 2]] -> [6, 12]
ferhat elmas
fuente