vectores una recorrer multiplicacion matriz matrices libreria elementos ejemplos bidimensionales arreglos array agregar python arrays numpy element

python - recorrer - Numpy ValueError: configuración de un elemento de matriz con una secuencia. Este mensaje puede aparecer sin la existencia de una secuencia?



recorrer una matriz en python (6)

Creo que las matrices de python solo admiten valores. Así que conviértalo en una lista:

kOUT = np.zeros(N+1) kOUT = kOUT.tolist()

¿Por qué recibo este mensaje de error? ValueError: configuración de un elemento de matriz con una secuencia. Gracias

Z=np.array([1.0,1.0,1.0,1.0]) def func(TempLake,Z): A=TempLake B=Z return A*B Nlayers=Z.size N=3 TempLake=np.zeros((N+1,Nlayers)) kOUT=np.zeros(N+1) for i in xrange(N): kOUT[i]=func(TempLake[i],Z)


Es una pena que ambas respuestas resuelvan el problema, pero no dieron una conclusión para resolverlo. Veamos el código.

Z = np.array([1.0, 1.0, 1.0, 1.0]) def func(TempLake, Z): A = TempLake B = Z return A * B Nlayers = Z.size N = 3 TempLake = np.zeros((N+1, Nlayers)) kOUT = np.zeros(N + 1) for i in xrange(N): # store the i-th result of # function "func" in i-th item in kOUT kOUT[i] = func(TempLake[i], Z)

El error muestra que establece el i-ésimo ítem de kOUT (dtype: int) en una matriz, cada ítem en kOUT es solo un ítem int, no puede apuntar a otro tipo de datos, debe cambiar la declaración para cambiar el tipo de datos de kOUT . Por ejemplo, como:

Cambiar la declaración a continuación:

kOUT = np.zeros(N + 1)

dentro:

kOUT = np.zeros(N + 1, dtype=object)

o:

kOUT = np.zeros((N + 1, N + 1))

Todo el código:

import numpy as np Z = np.array([1.0, 1.0, 1.0, 1.0]) def func(TempLake, Z): A = TempLake B = Z return A * B Nlayers = Z.size N = 3 TempLake = np.zeros((N + 1, Nlayers)) kOUT = np.zeros(N + 1, dtype=object) for i in xrange(N): kOUT[i] = func(TempLake[i], Z)

Espero que te ayude.


KOUT [i] es un elemento único de una lista. Pero estás asignando una lista a este elemento. tu func está generando una lista.


Para poner una secuencia u otra matriz numpy en una matriz numpy, solo cambia esta línea:

kOUT=np.zeros(N+1)

a:

kOUT=np.asarray([None]*(N+1))

O:

kOUT=np.zeros((N+1), object)


Recibes el mensaje de error

ValueError: setting an array element with a sequence.

porque estás tratando de establecer un elemento de matriz con una secuencia. No estoy tratando de ser lindo, ahí - el mensaje de error está tratando de decirle exactamente cuál es el problema. No lo piense como un error críptico, es simplemente una frase. ¿Qué línea está dando el problema?

kOUT[i]=func(TempLake[i],Z)

Esta línea intenta establecer el ith elemento de kOUT con cualquier func(TempLAke[i], Z) devuelve. Mirando el caso i=0 :

In [39]: kOUT[0] Out[39]: 0.0 In [40]: func(TempLake[0], Z) Out[40]: array([ 0., 0., 0., 0.])

Está intentando cargar un conjunto de 4 elementos en kOUT[0] que solo tiene un flotante. Por lo tanto, está intentando establecer un elemento de matriz (el lado izquierdo, kOUT[i] ) con una secuencia (el lado derecho, func(TempLake[i], Z) ).

Probablemente func no está haciendo lo que quieres, pero no estoy seguro de lo que realmente querías que hiciera (y no olvides que usualmente puedes usar operaciones vectorizadas como A * B en lugar de bucle en numpy.) Eso debería explicar el problema, de todos modos.


Z=np.array([1.0,1.0,1.0,1.0]) def func(TempLake,Z): A=TempLake B=Z return A*B Nlayers=Z.size N=3 TempLake=np.zeros((N+1,Nlayers)) kOUT=np.vectorize(func)(TempLake,Z)

Esto también funciona, en lugar de bucles, simplemente vectorize, pero lea a continuación las notas de la documentación scipy: https://docs.scipy.org/doc/numpy/reference/generated/numpy.vectorize.html

La función vectorizar se proporciona principalmente por conveniencia, no por rendimiento. La implementación es esencialmente un ciclo for.

Si no se especifica otypes, se usará una llamada a la función con el primer argumento para determinar el número de salidas. Los resultados de esta llamada se almacenarán en caché si la caché es verdadera para evitar llamar a la función dos veces. Sin embargo, para implementar la memoria caché, la función original debe estar ajustada, lo que ralentizará las llamadas subsiguientes, por lo tanto, solo haga esto si su función es costosa.