2011-10-13 30 views
22

Tengo una matriz numpy 2D y tengo una serie de filas y columnas que deben establecerse en un valor particular. Consideremos el siguiente ejemplocómo modificar una matriz numpy 2D en ubicaciones específicas sin un bucle?

a = array([[1, 2, 3], 
      [4, 5, 6], 
      [7, 8, 9]]) 

Deseo modificar entradas en filas [0,2] y columnas [1,2]. Esto debe resultar en la siguiente matriz

a = array([[1, 2, 0], 
      [4, 5, 0], 
      [7, 8, 9]]) 

Yo siguiente y que dio lugar a la modificación de cada secuencia de la columna en cada fila

rows = [0,1] 
cols = [2,2] 
b=a[numpy.ix_(rows,columns)] 

El resultado fue la siguiente matriz modificación de cada columna de la matriz especificada

array([[1, 0, 0], 
     [4, 5, 6], 
     [7, 0, 0]]) 

¿Alguien podría decirme cómo hacerlo?

Muchas gracias

EDIT: Es de señalar que las filas y columnas coincidentemente happend ser sequentia. El verdadero punto es que estos podrían ser arbitrarios y en cualquier orden. si es rows = [a, b, c] y cols = [n x z] entonces quiero modificar exactamente tres elementos en las ubicaciones (a, n), (b, x), (c, z).

Respuesta

16

Agregando a lo que han dicho, puede modificar estos elementos mediante la indexación de fantasía de la siguiente manera:

In [39]: rows = [0,1] 

In [40]: cols = [2,2] 

In [41]: a = np.arange(1,10).reshape((3,3)) 

In [42]: a[rows,cols] = 0 

In [43]: a 
Out[43]: 
array([[1, 2, 0], 
     [4, 5, 0], 
     [7, 8, 9]]) 

Es posible que desee leer la documentación sobre la indexación de matrices multidimensionales: http://docs.scipy.org/doc/numpy/user/basics.indexing.html#indexing-multi-dimensional-arrays

El punto clave es:

si las matrices de índice tienen una forma coincidente, y hay una matriz de índice para cada dim Ension de la matriz que se indexa, la matriz resultante tiene la misma forma que las matrices de índice, y los valores corresponden al índice establecido para cada posición en las matrices de índice.

Es importante destacar que esto también le permite hacer cosas como:

In [60]: a[rows,cols] = np.array([33,77]) 

In [61]: a 
Out[61]: 
array([[ 1, 2, 33], 
     [ 4, 5, 77], 
     [ 7, 8, 9]]) 

donde se puede establecer cada elemento de forma independiente utilizando otra matriz, lista o tupla del mismo tamaño.

+0

Tienes mucha razón. Gracias por señalar a la documentación. Fue un error en el programa. Lo sabía pero no podía funcionar. Tu respuesta es muy explicativa. – Shan

+0

¿Qué pasa con la sintaxis [x] que está pasando? –

+0

@johnktejik Eso es solo el resultado de una celda de ejecución de un notebook ipython/jupyter. Piense en ello como un aviso numerado en línea. – JoshAdel

2

En primer lugar, su descripción de la variedad "correcta" no coincide con las columnas y filas que especifique ...

Para obtener su matriz "correcta", que haría esto:

a[:2, 2] = 0 

Para modificar las columnas segunda y tercera de la primera y la tercera filas, (filas [0,2] y columnas [1,2]) harías lo que estás haciendo ... (Tu descripción de la modificación filas [0,2] y columnas [1,2] es exactamente el resultado que obtiene, ¿no?)

+1

El punto es que no quiero que sea secuencial ... La columna y la fila pueden ser números arbitrarios. – Shan

0

Debe ser tan simple como s a [0,2] = 0 y a [1,2] = 0. También podría hacer un [0: 2,2] = 0. La indexación de rango basada en ':' en python es un intervalo semiabierto [0,2] que realmente varía de 0 a 1 (el punto final de 2 no está incluido).

1

un trabajo en torno a: ndarray.flatten, np.put(), ndarray.reshape

tratar ndarray.flatten(array), de esa manera se trata de una variedad tenue que puede ser manipulado con numpy.put(array,[indices],[values]). Luego use ndarray.reshape() para obtener las dimensiones originales.

Cuestiones relacionadas