Fatiar matrizes com listas

8

Então, eu crio uma 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]])

Uma fatia convencional a[1:3,1:3]retorna

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

assim como usar uma lista no segundo a[1:3,[1,2]]

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

No entanto, a[[1,2],[1,2]]retorna

matriz ([6, 12])

Obviamente não estou entendendo algo aqui. Dito isto, fatiar com uma lista pode ocasionalmente ser muito útil.

Felicidades,

keng

keng
fonte
É a[[1,2],[1,2]]suposto dizer a[[1:2],[1:2]]? Existe um erro de digitação a[1:3,[1,2]]? Ou estou entendendo mal?
SherylHohman 14/01

Respostas:

2

Você observou o efeito da chamada Indexação avançada . Vamos considerar o exemplo do 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]

Você pode pensar nisso como fornecer listas de coordenadas (cartesianas) da grade, como

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

No último caso, as duas listas individuais são tratadas como operações de indexação separadas (este é um texto realmente estranho, por favor, tenha paciência comigo).

Numpy vê duas listas de dois números inteiros e decide que você está pedindo dois valores. O índice de linha de cada valor vem da primeira lista, enquanto o índice da coluna de cada valor vem da segunda lista. Portanto, você recebe a[1,1]e a[2,2]. A :notação não apenas se expande para a lista que você deduziu com precisão, mas também indica que você deseja todas as linhas / colunas nesse intervalo.

Se você fornecer índices de lista com curadoria manual, eles deverão ter o mesmo tamanho, porque o tamanho de cada lista é o número de elementos que você receberá. Por exemplo, se você deseja os elementos nas colunas 1 e 2 das linhas 1,2,3:

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

Mas

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

O ex-diz numpy que você quer um intervalo de linhas e colunas específicas, enquanto o segundo diz "me os elementos a (1,1), (2,2)e (3, hey! what the?! where's the other index?)"

inspectorG4dget
fonte
0

a[[1,2],[1,2]]está lendo isso como, eu quero um [1,1] e um [2,2]. Existem algumas maneiras de contornar isso e eu provavelmente nem tenho as melhores, mas você pode tentar

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

Isso fornecerá uma versão achatada acima

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

Isso fornecerá a fatia correta; funciona pegando as linhas [1,2] e depois as colunas [1,2].

cmxu
fonte
0

Ele aciona a indexação avançada, de modo que a primeira fatia é o índice de linha, a segunda é o índice da coluna. Para cada linha, ele seleciona a coluna correspondente.

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