Error: establecer un elemento de matriz con una secuencia. pitón / numpy

Recibo este error cuando intento asignar una matriz a otra posición específica de la matriz. Estaba haciendo esto antes de crear listas simples y hacer esa tarea. Pero Numpy es más rápido que las listas simples y estaba tratando de usarlo ahora.

El problema es que tengo una matriz 2D que almacena algunos datos y, en mi código, tengo, por ejemplo, que calcular el gradiente para cada valor de posición, así que creo otra matriz 2D donde cada posición almacena el gradiente para su valor.

import numpy as np

cols = 2
rows = 3

# This works
matrix_a = []

for i in range(rows):
    matrix_a.append([0.0] * cols)

print matrix_a    
matrix_a[0][0] = np.matrix([[0], [0]])    
print matrix_a

# This doesn't work
matrix_b = np.zeros((rows, cols)) 
print matrix_b   

matrix_b[0, 0] = np.matrix([[0], [0]])

Lo que sucede es que tengo una clase que define un np.ceros((filas, columnas)) objeto, que almacena información sobre algunos datos, simplificando, por ejemplo, datos de imágenes.

class Data2D(object):
    def __init__(self, rows=200, cols=300):
        self.cols = cols
        self.rows = rows
        # The 2D data structure
        self.data = np.zeros((rows, cols))

En un método específico, tengo que calcular el gradiente para estos datos, que es una matriz de 2 x 2 (por eso me gustaría usar ndarray, y no un simple matriz), y, para ello, creo otra instancia de este objeto para almacenar estos nuevos datos, en la que cada punto (píxel) debe almacenar su degradado. Estaba usando listas simples, que funcionan, pero pensé que podría ganar algo de rendimiento con numpy.

¿Hay una manera de evitar esto? ¿O una mejor manera de hacer tal cosa? Sé que puedo definir el tipo de matriz para objeto, pero no sé si pierdo rendimiento haciendo tal cosa.

Gracias por su atención.

preguntado el 15 de febrero de 14 a las 20:02

Recepción qué ¿error? Proporcione un rastreo completo. -

2 Respuestas

El problema es que matrix_b está por defecto en un dtype flotante. En mi máquina, comprobando

matrix_b.dtype

devoluciones dtype('float64'). Para crear una matriz numpy que pueda contener cualquier cosa, puede configurar manualmente dtype en objeto, lo que le permitirá colocar una matriz dentro de ella:

matrix_b = np.zeros((rows, cols), dtype=object)
matrix_b[0, 0] = np.matrix([[0], [0], [1]])

Respondido 16 Feb 14, 07:02

Si lo se. Pero pensé que perdería mucho rendimiento haciendo tal cosa. - pceccon

Podría agregar otra dimensión de tamaño 3 a su matriz.

import numpy as np

cols = 2
rows = 3
matrix_b = np.zeros((rows, cols, 3)) 
matrix_b[0, 0] = np.array([0, 0, 1])
matrix_b[0, 0] = [0, 0, 1]  #This also works 

Otra opción es establecer el dtype en list y luego puede configurar cada elemento en una lista. Pero esto no es realmente recomendable, ya que perderá gran parte del rendimiento de velocidad de numpy al hacer esto.

matrix_b = np.zeros((rows, cols), dtype=list) 
matrix_b[0, 0] = [0, 0, 1]

Respondido 15 Feb 14, 20:02

Gracias. Simplemente no sé si esta es la mejor solución. Supongo que tendré que cambiar todo mi código y es posible que se vuelva ilegible. :S - pceccon

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.