簡體   English   中英

用另一個列表中相同索引處的值替換列表中的錯誤值

[英]Replace bad values in list with values at same indexes in another list

我有兩個列表,分別是zw

z = [323, 493, 245, 542, 352, 463, 352]
w = [300, -9999, 4343, 320, -9999, -9999, -9999]

現在,我需要通過將所有-9999替換為相應的z值來更新w的值。 如果我打印w ,則值將為

w = [300, 493, 4343, 320, 352, 463, 352]

這是我得到的代碼:

w[w == -9999] = z

但是我明白了

w = [[300, 493, 4343, 320, 352, 463, 352], -9999, 4343, 320, -9999, -9999, -9999]
z = [323, 493, 245, 542, 352, 463, 352]
w = [300, -9999, 4343, 320, -9999, -9999, -9999]

for index,value in enumerate(w):
    if value == -9999:
        w[index] = z[index]

輸出量

[300, 493, 4343, 320, 352, 463, 352]

可以在列表理解中應用相同的想法

>>> [z[index] if value == -9999 else w[index] for index, value in enumerate(w)]
[300, 493, 4343, 320, 352, 463, 352]

這是代碼行評估中發生的事情:

w[w == -9999] = z
w[False] = z      # w is a list, so isn't equal to -9999
w[0] = z          # False == 0

因此,將w的第一個(第0個)元素替換為z引用的列表。

相反,我認為您想要:

w = [z_val if w_val == -9999 else w_val
     for w_val, z_val in zip(w, z)]

這是使用zip內置函數來遍歷wz的項目對的列表理解

由於沒有真正的理由遍歷兩個列表或將它們壓縮在一起,因此您可以這樣做-這樣可以更快:

def replace_values(w, z):
    return [z[num] if x == -9999 else x for num, x in enumerate(w)]

您可以使用map來做到這一點:

>>> z = [323, 493, 245, 542, 352, 463, 352]
>>> w = [300, -9999, 4343, 320, -9999, -9999, -9999]
>>> map(lambda t: t[0] if t[1]==-9999 else t[1], zip(z,w))
[300, 493, 4343, 320, 352, 463, 352]

Numpy的自然用法:

>>> import numpy as np
>>> z = np.array([323, 493, 245, 542, 352, 463, 352])
>>> w = np.array([300, -9999, 4343, 320, -9999, -9999, -9999])
>>> idx=np.where(w==-9999)
>>> w[idx]=z[idx]
>>> w
array([ 300,  493, 4343,  320,  352,  463,  352])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM