Quiero crear una matriz que contenga elementos matriciales. Entonces hice lo obvio e hice esto:

import numpy as np

A = np.array([1,2,3,1],[3,1,5,1])
B = np.array([1,6,8,9],[9,2,7,1])
E = np.array([A, B],[B, A])

Pero el compilador devuelve: TypeError: tipo de datos no entendido

¿Qué puedo hacer para crear una matriz de este tipo, porque tengo matrices realmente enormes y no tengo tiempo para escribir explícitamente a todos?


* Editar 1: *

Problema adicional que ocurrió:

enter image description here

En lugar de obtener una matriz de 14x14, obtengo una matriz multidimensional (2,2,7,7). Donde en la versión simplificada que era mi pregunta original, todo es correcto. ¿Alguna idea de por qué ocurre esto ahora?

En este caso tengo la Amat 7x7, Bmat 7x7, Emat 14x14, Smat 14x14.


Editar 2

Ok, resolví el problema usando np.block () como se indicó en los comentarios a continuación. Muchas gracias.


2
GeometricalFlows 7 sep. 2018 a las 18:59

3 respuestas

La mejor respuesta

Suponiendo que desea una matriz bidimensional de forma (4, 8) como resultado, parece que está buscando numpy.block. Está disponible desde NumPy 1.13, y como su nombre lo indica, crea una nueva matriz de bloques, donde cada bloque es una matriz existente.

También necesita un par adicional de corchetes en las llamadas que crean A y B. La firma de numpy.array es:

array (objeto, dtype = None, copy = True, order = 'K', subok = False, ndmin = 0)

Entonces, si escribe np.array([1, 2, 3, 1], [3, 1, 5, 1]), entonces está pasando dos argumentos a la función array, y el segundo argumento se interpretará como dtype: es decir, el tipo de datos deseado de los elementos de formación. Es por eso que obtiene el error "tipo de datos no entendido". En su lugar, desea pasar una lista de listas anidadas como primer argumento: np.array([[1, 2, 3, 1], [3, 1, 5, 1]]).

Poniendolo todo junto:

>>> import numpy as np
>>> A = np.array([[1, 2, 3, 1], [3, 1, 5, 1]])
>>> B = np.array([[1, 6, 8, 9], [9, 2, 7, 1]])
>>> E = np.block([[A, B], [B, A]])
>>> A
array([[1, 2, 3, 1],
       [3, 1, 5, 1]])
>>> B
array([[1, 6, 8, 9],
       [9, 2, 7, 1]])
>>> E
array([[1, 2, 3, 1, 1, 6, 8, 9],
       [3, 1, 5, 1, 9, 2, 7, 1],
       [1, 6, 8, 9, 1, 2, 3, 1],
       [9, 2, 7, 1, 3, 1, 5, 1]])
4
Mark Dickinson 7 sep. 2018 a las 16:26

Y bienvenida a Stack Overflow!

El np.array quiere el primer argumento ser la matriz y el segundo argumento ser el tipo de datos.

Aquí, en realidad está enviando dos listas como los dos primeros argumentos. Como una lista de números no es un tipo de datos, no comprende lo que está intentando hacer. Debe incluirlo en una lista:

import numpy as np

A = np.array([[1,2,3,1],[3,1,5,1]])
B = np.array([[1,6,8,9],[9,2,7,1]])
E = np.array([[A, B],[B, A]])

Para enviar un tipo de datos, puede hacer, p.

D = np.array([1,2,3,4,5], np.float32). Ahora el segundo argumento es un tipo de datos real, y no una lista.

3
Andreas Storvik Strauman 7 sep. 2018 a las 16:04

Estabas cerca, solo faltaban algunos paréntesis. Para una matriz, debe proporcionar a np.array una lista de listas.

In [4]: import numpy as np
   ...: 
   ...: A = np.array([[1,2,3,1],[3,1,5,1]])
   ...: B = np.array([[1,6,8,9],[9,2,7,1]])
   ...: E = np.array([[A, B],[B, A]], dtype=int)
   ...: 

In [5]: E
Out[5]: 
array([[[[1, 2, 3, 1],
     [3, 1, 5, 1]],

    [[1, 6, 8, 9],
     [9, 2, 7, 1]]],


   [[[1, 6, 8, 9],
     [9, 2, 7, 1]],

    [[1, 2, 3, 1],
     [3, 1, 5, 1]]]])
1
maow 12 sep. 2018 a las 15:01