diferencia de python entre las dos formas de matriz x y x

Quiero entender la diferencia entre x[i,j] y x[i][j] donde x es una matriz

 x = np.zeros((N,M)) 

La respuesta que encontré al hacer la investigación es siempre acerca de la matriz con dimensión 2D, pero en mi caso tengo una matriz con dos índices para trabajar con i y j, y tengo que manipular la matriz según el índice con un bucle for.

  for i in range(1,N+1): for j in range(1,M+1): x[i-1][j-1]=random.uniform(5,10) 

entonces, ¿pueden ayudarme a comprender la diferencia entre x[i,j] y x[i][j] y para ser más claros para cada i (estación base) hay una cantidad de j (usuarios)

Para la indexación simple de una matriz 2d, ambas formas funcionan:

 In [28]: x = np.arange(6).reshape(2,3) In [29]: x Out[29]: array([[0, 1, 2], [3, 4, 5]]) In [30]: x[1,2] Out[30]: 5 In [31]: x[1][2] Out[31]: 5 

Para np.matrix (que probablemente no deberías usar de todos modos) no son:

 In [32]: X = np.matrix(x) In [33]: X Out[33]: matrix([[0, 1, 2], [3, 4, 5]]) In [34]: X[1,2] Out[34]: 5 In [35]: X[1][2] ... IndexError: index 2 is out of bounds for axis 0 with size 1 

Las dos formas no son sintácticamente las mismas. [1][2] primero indexa con 1, y luego indexa el resultado con 2. Eso no es lo mismo que indexar una vez con ambos parámetros.

 In [36]: x[1] Out[36]: array([3, 4, 5]) # (3,) shape In [37]: X[1] Out[37]: matrix([[3, 4, 5]]) # (1,3) shape 

El error surge porque np.matrix devuelve otro np.matrix . Por lo tanto, la próxima [2] indexación volverá a indexar la primera dimensión.

x[1] es realmente corto para x[1,:] , es decir, indexa la primera dimensión y corta todo el rest (o X[1,...] para permitir 3d y superior). Entonces x[1][2] es realmente

 temp = x[1,:] temp[2] 

o para el caso de la matriz:

 temp = X[1,:] temp[2,:] 

En otras palabras, es 2 operaciones de indexación. Es una expresión de Python, no un uso numpy específico.

Cuando indexamos con listas o cortes, la diferencia entre las dos formas se vuelve más significativa, especialmente cuando se establecen valores.

Animo a los principiantes a usar la forma x[i,j] . No uses x[1][2] menos que realmente entiendas lo que está pasando.

Si es necesario, podría ver cómo se traduce la indexación en llamadas a __setitem__ y __getitem__ .

Son equivalentes según el manual de Numpy v1.15.1.

Nota En Python, x [(exp1, exp2, …, expN)] es equivalente a x [exp1, exp2, …, expN]; el último es solo azúcar sintáctica para el primero.