У меня проблема с основной заменой. У меня есть два массива, один из которых содержит числа и NaN, а другой - числа, которые должны заменить NaN, очевидно, упорядоченные по желанию. В качестве примера: x1 = [NaN, 2, 3, 4, 5, NaN, 7, 8, NaN, 10] и fill = [1, 6, 9] и я хочу получить замену по индексу массива вроде: { { Х2 }}

Я написал эту идиотскую строку кода, которая заменяет весь NaN первым элементом массива 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]

Как мне добиться своего результата?

-2
james42 1 Мар 2018 в 00:13

3 ответа

Лучший ответ

Это работает для вас?

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

Выход:

[  2.   4.   4.   8.  32.   1.  12.   3.]
3
user3483203 28 Фев 2018 в 21:18

Ответ от @chrisz является правильным, потому что у вас есть сила numpy, так что используйте его :-)

Но если вы все еще хотите сделать это так, как вы начали, вы можете исправить код следующим образом:

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

Вы были почти там, вам просто нужно было правильно посчитать индекс заполнения (возможно, добавив некоторую проверку для индекса вне границ).

Но, как я уже сказал, определенно идите в тупик, это быстрее и чище.

1
ChatterOne 28 Фев 2018 в 21:25

Следующее должно работать, даже если размер fill не совпадает с числом nan с

>>> 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 Фев 2018 в 21:22