Error: establecer un elemento de matriz con una secuencia. pitón / numpy
Frecuentes
Visto 45,679 equipos
11
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.
2 Respuestas
21
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
8
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 python arrays numpy or haz tu propia pregunta.
Recepción qué ¿error? Proporcione un rastreo completo. - jonrsharpe