2015-10-16 2 views
2

Здесь что-то странное (по крайней мере, для меня странное). Я пытаюсь пометить «nan» значения из одного списка и соответствующие значения из другого списка. Мне сообщили, что вы не можете поместить из списка, который перечисляется, поэтому я сделал временный список.Вычисление значений из двух списков одновременно

import numpy as np 
a=[] 
b=[] 

for i in range(0,100): #alternating list of ints and nan 
    if i/2. == i/2: 
     a.append(i) 
    else: 
     a.append(np.mean([])) #the only way I know how to make nan 
    b.append(i*100) 

atemp=a 
print(len(a),len(atemp)) 
for i,v in enumerate(atemp): 
    if np.isnan(v): 
     a.pop(i) 
     b.pop(i) 
print(len(a),len(atemp)) 

Пару вещей происходит, что я не понимаю:

1) это, кажется, выскакивают из atemp пренебрежимо малых и а, хотя я только говорю это a.pop (я) и не atemp.pop (i). Есть ли какая-то функция перегрузки или что-то приравнивающее a и atemp, которые я не вижу? Как мне сделать их совершенно отдельные списки (т.е. только выскочить из а и не atemp?

2) не появляются все Нэн и цикл должен быть повторен несколько раз, чтобы выскочить все Нэн

+2

'atemp = a' делает' atemp' и 'a' точку в том же списке. Если вы хотите, чтобы они были разными (т. Е. Удаление из 'atemp' не удаляется из' a'), вам нужно 'atemp = a [:]'. –

+0

Кроме того: если вы используете numpy, вы можете использовать 'np.nan' напрямую, чтобы получить значение NaN. Даже без этого вы можете делать 'float (" nan ")'. – DSM

+0

Благодарим вас за очень быстрые и полезные ответы. К сожалению, я получаю False с [1] == np.nan и a [1] = float ("nan") Я все еще не получаю то, что хочу. Если вы перейдете из списка, перечислив список atemp, я столкнулся с ошибкой «pop index out of range». Должен быть более простой способ ... возможно, используя zip (a, b) – Wes

ответ

1

насчет это

# use this to filter None values in b 
a, b = zip(*((x,y) for x,y in zip(a, b) if y)) 

# use this to filter np.nan in b 
a, b = zip(*((x,y) for x,y in zip(a, b) if not np.isnan(y))) 
+0

* Если y * доказательство, если y - это что-то еще, то пустое или Нет, замените его следующим образом: if y! = Np.nan или if not np.isnan (y) – rebeling

+0

a [1] = nan отсутствует np, но ur right , Вместо этого используйте np.isnan (x), np.nan - это не просто значение его объекта со ссылкой. Когда вы сравниваете это с другим, то False имеет смысл. Но если вы проверите тип, который вы его получите;) – rebeling

2

есть гораздо более простые способы, но если вы хотите использовать свой собственный код, вам нужно копиюa не просто создать ссылки и использовать другую логику, чтобы удалить элементы из списка, зацикливание над диапазон len -1 в обратном направлении даст вам вывод, который вы хотите:

import numpy as np 

a = [] 
b = [] 

for i in range(0, 100): # alternating list of ints and nan 
    if i % 2 == 0: 
     a.append(i) 
    else: 
     a.append(np.nan) #the only way I know how to make nan 
    b.append(i * 100) 

atemp = a[:] 
print(len(a), len(atemp)) 

for i in range(len(a)-1,-1,-1): 
    if np.isnan(a[i]): 
     a.pop(i) 
     b.pop(i) 
print(len(a), len(atemp)) 
+0

nice one range (len (a) -1, -1, -1) ...обратный диапазон, не знал этого;) – rebeling

+0

@ rebeling обычно вы использовали бы обратный, но поскольку мы использовали поп и два списка, необходимо было использовать диапазон в обратном –

1

Это сделал это:

a, b = zip(*[(x,y) for x,y in zip(a, b) if np.isfinite(y)]) 

Спасибо всем. Извините, что ответ мятежника был отклонен, так как он мне очень помог.

+0

Внутренний список comp не нужен, достаточно выражения генератора –

+0

@ PadraicCunningham, как он выглядит с генератором? – rebeling

+1

@rebeling, просто замените [] на() –

 Смежные вопросы

  • Нет связанных вопросов^_^