es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Matriz dispersa Tocoo() ValueError: El búfer tiene un número incorrecto de dimensiones (se esperaba 1, se obtuvo 2)

Este es el código, no sé por qué da error.
x e y son del mismo tipo, y puede ejecutar y.tocoo() pero x no puede.
Cuando ejecuto este código en Google Colab, no tiene ningún error.
¿Me puedes ayudar?

ipdb > x = scipy.sparse.lil_matrix(y.shape)
ipdb > x.rows = preds_k
ipdb > x.data = np.ones_like(preds_k)
ipdb > x
<4217x1018 sparse matrix of type '<class 'numpy.float64'>'
    with 84340 stored elements in List of Lists format>
ipdb > y
<4217x1018 sparse matrix of type '<class 'numpy.float64'>'
    with 13037 stored elements in List of Lists format>
ipdb > x.shape
(4217, 1018)
ipdb > y.shape
(4217, 1018)
ipdb > x.tocoo()
*** ValueError: Buffer has wrong number of dimensions (expected 1, got 2)
ipdb > y.tocoo()
<4217x1018 sparse matrix of type '<class 'numpy.float64'>'
    with 13037 stored elements in COOrdinate format>

Gracias.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El error ValueError: El buffer tiene un número incorrecto de dimensiones ocurre cuando el objeto buffer, es decir, el objeto que se pasa a una función o método, tiene una forma o número de dimensiones inesperadas.

    En este caso, el error ocurre al intentar convertir la matriz dispersa x del formato lil al formato coo utilizando el método tocoo(). Sin embargo, dado que tanto x.rows como x.data son matrices bidimensionales, esto provoca que el método genere el error ValueError.

    Por otro lado, y.tocoo() funciona porque y ya se encuentra en formato coo.

    Para solucionar el error, x.rows y x.data deben convertirse a la forma esperada de matrices unidimensionales antes de llamar a tocoo(). Esto se puede lograr agregando .ravel() a las matrices como se muestra a continuación:

    ipdb> x.tocoo()
    *** ValueError: El buffer tiene un número incorrecto de dimensiones (se esperaba 1, se obtuvo 2)
    
    ipdb> x.rows = preds_k.ravel()
    ipdb> x.data = np.ones_like(preds_k.ravel())
    ipdb> x.tocoo()
    <4217x1018 matriz dispersa de tipo '<class 'numpy.float64'="">'
        con 84340 elementos almacenados en formato COOrdinado>
    

    Al hacer esto, x se convierte correctamente en formato coo sin errores.

Comments are closed.