Estoy enfrentando un problema con una sustitución básica. Tengo dos matrices, una de ellas contiene números y NaN, y la otra números que se supone que reemplazan al NaN, obviamente ordenados como deseo. Como ejemplo: x1 = [NaN, 2, 3, 4, 5, NaN, 7, 8, NaN, 10] y fill = [1, 6, 9] y quiero obtener mediante reemplazo por índice una matriz como: x1_final = [1, 2, 3, 4, 5, NaN, 7, 8, NaN, 10]

He escrito esta línea de código idiota, que sustituye todo el NaN con el primer elemento de la matriz fill:

for j in range(0,len(x1)):
    if np.isnan(x1[j]).any():
        for i in range(0,len(fill)):
            x1[j] = fill[i]

¿Cómo me las arreglo para lograr mi resultado?

-2
james42 1 mar. 2018 a las 00:13

3 respuestas

La mejor respuesta

¿Esto funciona para ti?

train = np.array([2, 4, 4, 8, 32, np.NaN, 12, np.NaN])
fill = [1,3]
train[np.isnan(train)] = fill
print(train)

Salida:

[  2.   4.   4.   8.  32.   1.  12.   3.]
3
user3483203 28 feb. 2018 a las 21:18

La respuesta de @chrisz es la correcta, porque tienes el poder de numpy, así que úsalo :-)

Pero si aún desea hacerlo de la manera que comenzó, puede arreglar el código de esta manera:

import numpy as np

x1 = [np.NaN, 2, 3, 4, 5, np.NaN, 7, 8, np.NaN, 10] 
fill = [1, 6, 9]
i = 0

for j in range(0, len(x1)):
    if np.isnan(x1[j]).any():
        x1[j] = fill[i]
        i += 1

print x1

Ya casi estabas allí, solo necesitabas contar correctamente el índice del relleno (quizás agregando alguna verificación para un índice fuera de límites).

Pero, como dije, definitivamente va por el camino complicado, es más rápido y más limpio.

1
ChatterOne 28 feb. 2018 a las 21:25

Lo siguiente debería funcionar incluso si el tamaño de fill no coincide con el número de nan s

>>> x1 = np.random.randint(0, 4, (10,))
>>> x1 = x1/x1 + x1
>>> 
>>> x1
array([ 4., nan, nan,  4., nan,  3., nan,  2.,  3.,  4.])
>>> 
>>> fill = np.arange(3)
>>> 
>>> loc, = np.where(np.isnan(x1))
>>> 
>>> x1[loc[:len(fill)]] = fill[:len(loc)]
>>> 
>>> x1
array([ 4.,  0.,  1.,  4.,  2.,  3., nan,  2.,  3.,  4.])
1
Paul Panzer 28 feb. 2018 a las 21:22