Tengo una variable, x, que tiene la forma (2,2,50,100).
También tengo una matriz, y, que es igual a np.array([0,10,20]). Sucede algo extraño cuando indexo x[0,:,:,y].
x = np.full((2,2,50,100),np.nan) y = np.array([0,10,20]) print(x.shape) (2,2,50,100) print(x[:,:,:,y].shape) (2,2,50,3) print(x[0,:,:,:].shape) (2,50,100) print(x[0,:,:,y].shape) (3,2,50)¿Por qué el último da como resultado (3,2,50) y no (2,50,3)?
Se llama combining advanced and basic indexing . Al combining advanced and basic indexing , numpy realiza la indexación en la indexación avanzada primero y subespacia/concatena el resultado a la dimensión de la indexación básica.
Ejemplo de documentos:
Sea x.shape (10,20,30,40,50) y suponga que ind_1 e ind_2 pueden transmitirse a la forma (2,3,4). Entonces x[:,ind_1,ind_2] tiene forma (10,2,3,4,40,50) porque el subespacio con forma (20,30) de X ha sido reemplazado por el subespacio (2,3,4) de los índices Sin embargo, x[:,ind_1,:,ind_2] tiene forma (2,3,4,10,30,50) porque no hay un lugar inequívoco para colocar en el subespacio de indexación, por lo que se agrega al principio . Siempre es posible usar .transpose() para mover el subespacio a cualquier lugar deseado. Tenga en cuenta que este ejemplo no se puede replicar usando take.
entonces, en x[0,:,:,y] , 0 e y son indexación avanzada. Se transmiten juntos para producir la dimensión (3,) .
In [239]: np.broadcast(0,y).shape Out[239]: (3,) Este (3,) se une al comienzo de la 2.ª y 3.ª dimensión para formar (3, 2, 50)
Para ver que la primera y la última dimensión realmente se transmiten juntas, puede intentar cambiar 0 a [0,1] para ver el error de transmisión.
print(x[[0,1],:,:,y]) Output: IndexError Traceback (most recent call last) <ipython-input-232-5d10156346f5> in <module> ----> 1 x[[0,1],:,:,y] IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (2,) (3,)