python:消除nan在多个列表中的位置
python: eliminate positions of nan in multiple lists
我来自 IDL 并试图在两个数据列表中找到并消除 NaN。假设列表 A 的位置 5 有一个 NaN 但列表 B 没有。我需要在两个列表中删除位置 5。像这样...
A = [1, NaN, 3, 4, NaN, 6, 7, 8, 9]
B = [1', 2', 3', NaN, 5', 6', 7', 8', NaN]
A_new = [1 , 3 , 6 , 7 , 8 ]
B_new = [1', 3', 6', 7', 8']
这是工作正常的 IDL 代码。我只需要将它翻译成 python,但我很困惑。
;Removes the NANs
loc = where((Finite(pdcsapflux) EQ 1)and(Finite(time) EQ 1))
flux_nonan = pdcsapflux(loc)
time_nonan = time(loc)
谢谢!!
我不知道 python 是否有 NaN,假设是 None。
ta, tb = [], []
for i in range(min(len(a), len(b))):
if a[i] is None or b[i] is None:
continue
ta.append(a[i])
tb.append(b[i])
ta, tb 是你输出的a,b
最后,您应该附加较长列表的其余项目。
A = [1, None, 3, 4, None, 6, 7, 8, 9]
B = [1, 2, 3, None, 5, 6, 7, 8, None]
print zip(*[
(a, b) for a, b in zip(A, B)
if a is not None and b is not None
])
根据@DSM 的建议,如果您来自 IDL,您可能希望将 numpy 用于实际数组,而不是列表。使用 numpy 直接替换 IDL 代码更像下面这样:
import numpy.random as ran
import numpy as np
arr = ran.rand(10) # create some fake data
arr[[1,3,5]] = np.nan # add some "bad" values
arr2 = arr[np.where(~np.isnan(arr))]
希望对您有所帮助。
如果你使用的是 numpy,你也可以不使用 where 函数(如果你使用大矩阵,通常会很慢)
import numpy as np
A = np.array([1, NaN, 3, 4, NaN, 6, 7, 8, 9])
B = np.array([1, 2, 3, NaN, 5, 6, 7, 8, NaN])
A_new = A[~np.isnan(A)]
B_new = B[~np.isnan(B)]
我来自 IDL 并试图在两个数据列表中找到并消除 NaN。假设列表 A 的位置 5 有一个 NaN 但列表 B 没有。我需要在两个列表中删除位置 5。像这样...
A = [1, NaN, 3, 4, NaN, 6, 7, 8, 9]
B = [1', 2', 3', NaN, 5', 6', 7', 8', NaN]
A_new = [1 , 3 , 6 , 7 , 8 ]
B_new = [1', 3', 6', 7', 8']
这是工作正常的 IDL 代码。我只需要将它翻译成 python,但我很困惑。
;Removes the NANs
loc = where((Finite(pdcsapflux) EQ 1)and(Finite(time) EQ 1))
flux_nonan = pdcsapflux(loc)
time_nonan = time(loc)
谢谢!!
我不知道 python 是否有 NaN,假设是 None。
ta, tb = [], []
for i in range(min(len(a), len(b))):
if a[i] is None or b[i] is None:
continue
ta.append(a[i])
tb.append(b[i])
ta, tb 是你输出的a,b 最后,您应该附加较长列表的其余项目。
A = [1, None, 3, 4, None, 6, 7, 8, 9]
B = [1, 2, 3, None, 5, 6, 7, 8, None]
print zip(*[
(a, b) for a, b in zip(A, B)
if a is not None and b is not None
])
根据@DSM 的建议,如果您来自 IDL,您可能希望将 numpy 用于实际数组,而不是列表。使用 numpy 直接替换 IDL 代码更像下面这样:
import numpy.random as ran
import numpy as np
arr = ran.rand(10) # create some fake data
arr[[1,3,5]] = np.nan # add some "bad" values
arr2 = arr[np.where(~np.isnan(arr))]
希望对您有所帮助。
如果你使用的是 numpy,你也可以不使用 where 函数(如果你使用大矩阵,通常会很慢)
import numpy as np
A = np.array([1, NaN, 3, 4, NaN, 6, 7, 8, 9])
B = np.array([1, 2, 3, NaN, 5, 6, 7, 8, NaN])
A_new = A[~np.isnan(A)]
B_new = B[~np.isnan(B)]