añadiendo matrices de diferentes formas

Me gustaría agregar dos matrices numpy de diferentes formas, pero sin transmitir, más bien los valores “faltantes” se tratan como ceros. Probablemente el más fácil con un ejemplo como

[1, 2, 3] + [2] -> [3, 2, 3] 

o

 [1, 2, 3] + [[2], [1]] -> [[3, 2, 3], [1, 0, 0]] 

No sé de antemano las formas.

Estoy jugando con la salida de np.shape para cada uno, tratando de encontrar la forma más pequeña que los contenga a los dos, incrustándolos en una matriz de esa forma y luego agregándolos. Pero parece bastante trabajo, ¿hay alguna forma más fácil?

¡Gracias por adelantado!

edit: por “mucho trabajo” me refería a “mucho trabajo para mí” en lugar de por la máquina, busco elegancia en lugar de eficiencia: mi esfuerzo por obtener la forma más pequeña para mantenerlos a ambos es

 def pad(a, b) : sa, sb = map(np.shape, [a, b]) N = np.max([len(sa),len(sb)]) sap, sbp = map(lambda x : x + (1,)*(N-len(x)), [sa, sb]) sp = np.amax( np.array([ tuple(sap), tuple(sbp) ]), 1) 

no es bonito :-/

Esto es lo mejor que se me ocurre:

 import numpy as np def magic_add(*args): n = max(a.ndim for a in args) args = [a.reshape((n - a.ndim)*(1,) + a.shape) for a in args] shape = np.max([a.shape for a in args], 0) result = np.zeros(shape) for a in args: idx = tuple(slice(i) for i in a.shape) result[idx] += a return result 

Puede limpiar un poco el bucle for si sabe cuántas dimensiones espera en el resultado, algo como:

 for a in args: i, j = a.shape result[:i, :j] += a 

Estoy jugando con la salida de np.shape para cada uno, tratando de encontrar la forma más pequeña que los contenga a los dos, incrustándolos en una matriz de esa forma y luego agregándolos. Pero parece bastante trabajo, ¿hay alguna forma más fácil?

Obtener la forma np.shape es trivial, encontrar la forma más pequeña que contenga ambas es muy fácil y, por supuesto, agregar es trivial, por lo que la única parte de “mucho trabajo” es la “incrustación” en una matriz de esa forma “.

Y sí, puede eliminar eso, simplemente llamando al método de cambio de resize (o la función de cambio de resize , si desea hacer copias en lugar de cambiarlas en el lugar). Como explican los documentos:

Ampliación de una matriz: … las entradas que faltan se rellenan con ceros

Por ejemplo, si conoces la dimensionalidad estáticamente:

 >>> a1 = np.array([[1, 2, 3], [4, 5, 6]]) >>> a2 = np.array([[2], [2]]) >>> shape = [max(a.shape[axis] for a in (a1, a2)) for axis in range(2)] >>> a1.resize(shape) >>> a2.resize(shape) >>> print(a1 + a2) array([[3, 4, 3], [4, 5, 6]])