Tanto en MATLAB como en Numpy, las matrices pueden indexarse mediante matrices. Sin embargo, el comportamiento es diferente. Déjame explicar esto por un ejemplo.Indización de matriz similar a MATLAB con Numpy
MATLAB:
>> A = rand(5,5)
A =
0.1622 0.6020 0.4505 0.8258 0.1067
0.7943 0.2630 0.0838 0.5383 0.9619
0.3112 0.6541 0.2290 0.9961 0.0046
0.5285 0.6892 0.9133 0.0782 0.7749
0.1656 0.7482 0.1524 0.4427 0.8173
>> A([1,3,5],[1,3,5])
ans =
0.1622 0.4505 0.1067
0.3112 0.2290 0.0046
0.1656 0.1524 0.8173
Numpy:
In [2]: A = arange(25).reshape((5,5))
In [3]: A
Out[3]:
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]])
In [6]: A[[0,2,4], [0,2,4]]
Out[6]: array([ 0, 12, 24])
En palabras: MATLAB selecciona filas y columnas, NumPy "cremalleras" las dos matrices de índice y utiliza las tuplas para que apunte a las entradas.
¿Cómo puedo obtener el comportamiento de MATLAB con Numpy?
Esto es realmente muy ineficiente. Requiere crear una matriz temporal en la memoria que puede ser bastante grande dependiendo del tamaño de las matrices con las que está trabajando. Hay varias formas más eficientes de hacerlo, incluido el uso de la función ix_ helper. –
Sí, todo correcto. Por otro lado, la cosa construida por 'ix_' también es bastante grande, aunque temporal. Hice algunos experimentos de sincronización para una matriz de 5x5 como en la pregunta original, con los siguientes resultados. '[,:] [:,]' es aproximadamente un 25% más rápido que '[ix _()]', pero si usa los mismos índices cada vez que construye una matriz de indexación * una vez * con 'ix_' y la vuelve a usar es aproximadamente 10 veces más rápido, aunque, por supuesto, pagas un costo por el uso de la memoria. –
np.ix_, en la mayoría de los casos, solo usa una cantidad trivial de memoria porque devuelve vistas de sus argumentos. También np.ix_ es una operación de tiempo constante, mientras que A [I1,:] [:, I2] es ~ n^2 tanto en tiempo como en uso de memoria. Pero si realmente necesitas un aumento del rendimiento del 25% en tu matriz 5x5, debes hacer lo que tienes que hacer. –