Cómo agregar elementos en una matriz numpy

Necesito realizar la siguiente tarea:

desde:

a = array([[1,3,4],[1,2,3]...[1,2,1]]) 

(agregue un elemento a cada fila) para:

 a = array([[1,3,4,x],[1,2,3,x]...[1,2,1,x]]) 

He intentado hacer cosas como una [n] = matriz ([1,3,4, x])

Pero Numpy se quejó de desajuste de forma. Intenté iterar a través de a elemento x y anexarlo a cada elemento, pero los cambios no se reflejan.

¿Alguna idea sobre cómo puedo lograr esto?

Anexar datos a una matriz existente es algo natural que se debe hacer para cualquier persona con experiencia en Python. Sin embargo, si se encuentra regularmente agregando a arreglos grandes, descubrirá rápidamente que NumPy no lo hace fácil o eficientemente como lo hace una list python. Encontrará que cada acción “anexar” requiere la reasignación de la memoria de matriz y la duplicación a corto plazo de los requisitos de memoria. Entonces, la solución más general al problema es tratar de asignar arreglos para que sean tan grandes como la salida final de su algoritmo. Luego realice todas sus operaciones en subconjuntos ( cortes ) de esa matriz. Idealmente, la creación y destrucción de matrices debería minimizarse.

Dicho esto, a menudo es inevitable y las funciones que hacen esto son:

para matrices 2-D:

  • np.hstack
  • np.vstack
  • np.column_stack
  • np.row_stack

para arreglos en 3-D (más arriba):

  • np.dstack

para matrices ND:

  • np.concatenate
 import numpy as np a = np.array([[1,3,4],[1,2,3],[1,2,1]]) b = np.array([10,20,30]) c = np.hstack((a, np.atleast_2d(b).T)) 

devuelve c :

 array([[ 1, 3, 4, 10], [ 1, 2, 3, 20], [ 1, 2, 1, 30]]) 

Una forma de hacerlo (puede que no sea la mejor) es crear otra matriz con los nuevos elementos y hacer column_stack. es decir

 >>>a = array([[1,3,4],[1,2,3]...[1,2,1]]) [[1 3 4] [1 2 3] [1 2 1]] >>>b = array([1,2,3]) >>>column_stack((a,b)) array([[1, 3, 4, 1], [1, 2, 3, 2], [1, 2, 1, 3]]) 

Anexar un solo escalar se podría hacer un poco más fácil como ya se mostró (y también sin convertirlo a flotar) expandiendo el escalar a un tipo de lista de python:

 import numpy as np a = np.array([[1,3,4],[1,2,3],[1,2,1]]) x = 10 b = np.hstack ((a, [[x]] * len (a) )) 

devuelve b como

 array([[ 1, 3, 4, 10], [ 1, 2, 3, 10], [ 1, 2, 1, 10]]) 

Anexar una fila se puede hacer por:

 c = np.vstack ((a, [x] * len (a[0]) )) 

devuelve c como

 array([[ 1, 3, 4], [ 1, 2, 3], [ 1, 2, 1], [10, 10, 10]]) 

Si x es solo un único valor escalar, podría intentar algo como esto para asegurar la forma correcta de la matriz que se agrega / concatena a la columna más a la derecha de a :

 import numpy as np a = np.array([[1,3,4],[1,2,3],[1,2,1]]) x = 10 b = np.hstack((a,x*np.ones((a.shape[0],1)))) 

devuelve b como

 array([[ 1., 3., 4., 10.], [ 1., 2., 3., 10.], [ 1., 2., 1., 10.]]) 

np.insert también puede usarse para el propósito

 import numpy as np a = np.array([[1, 3, 4], [1, 2, 3], [1, 2, 1]]) x = 5 index = 3 # the position for x to be inserted before np.insert(a, index, x, axis=1) 
 array([[1, 3, 4, 5], [1, 2, 3, 5], [1, 2, 1, 5]]) 

index también puede ser una list / tuple

 >>> index = [1, 1, 3] # equivalently (1, 1, 3) >>> np.insert(a, index, x, axis=1) array([[1, 5, 5, 3, 4, 5], [1, 5, 5, 2, 3, 5], [1, 5, 5, 2, 1, 5]]) 

o una slice

 >>> index = slice(0, 3) >>> np.insert(a, index, x, axis=1) array([[5, 1, 5, 3, 5, 4], [5, 1, 5, 2, 5, 3], [5, 1, 5, 2, 5, 1]]) 
 target = [] for line in a.tolist(): new_line = line.append(X) target.append(new_line) return array(target)