Python np.1D vs掩模的性能和可靠性
我使用numpy来处理一个时间序列,该时间序列有许多坏值=-9999.0。例如: VAL=[3,352.,-32.0e-3,-9999.0,35.,-9999.0] 我有许多不同的条件,这些值必须满足才能在我的条件下被接受。一个这样的削减可能是所有我的价值必须大于30。将此>30条件与坏值条件相结合的最合适方法是什么 我可以看到两种可能性: 1) 使用遮罩:Python np.1D vs掩模的性能和可靠性,python,numpy,time-series,slice,Python,Numpy,Time Series,Slice,我使用numpy来处理一个时间序列,该时间序列有许多坏值=-9999.0。例如: VAL=[3,352.,-32.0e-3,-9999.0,35.,-9999.0] 我有许多不同的条件,这些值必须满足才能在我的条件下被接受。一个这样的削减可能是所有我的价值必须大于30。将此>30条件与坏值条件相结合的最合适方法是什么 我可以看到两种可能性: 1) 使用遮罩: g_vals_mask = (vals > 30.) bv_mask = (vals > bad_val) mask = bv
g_vals_mask = (vals > 30.)
bv_mask = (vals > bad_val)
mask = bv_mask*g_vals_mask
idxs = np.where(mask)[0]
cut_vals=vals[idxs]
2) intersect idx列表:
g_idxs=np.where(vals>30.)
bv_idx=np.where(vals>-9999.0)
idxs=np.intersect1d(g_idx, bv_idx)
cut_vals=vals[idxs]
我结合许多不同类型的VAL进行重复计算,每种VAL都有不同的坏值。这是一种比另一种更好的做法吗?一个更有效还是更健壮
谢谢 假设数据是一维的,可以直接在值切片中使用遮罩:
import numpy as np
cut_vals=vals[np.logical_and(vals > 30, vals > bad_val)]
与您提出的方法相比,性能似乎有了一点改进。“相交”比“遮罩”方法慢一个数量级
# Average timing
# Masks:
# 0.309858489037
# Masks2:
# 0.351503372192
# Intersect:
# 2.1616836071
import numpy as np
import timeit as it
vals = np.random.rand(1000)
def masks2():
return vals[np.logical_and(vals > 0.7, vals > 0.1)]
# 1) using masks:
def masks():
g_vals_mask = (vals > 0.7)
bv_mask = (vals > 0.1)
mask = bv_mask*g_vals_mask
idxs = np.where(mask)[0]
return vals[idxs]
# 2) intersect idx lists:
def intersect():
g_idx=np.where(vals>0.7)
bv_idx=np.where(vals>0.1)
idxs=np.intersect1d(g_idx, bv_idx)
return vals[idxs]
if __name__ == '__main__':
reps = 10
number_iter = 10000
print 'Masks:'
print np.average(
np.array(it.repeat("masks()", setup="from __main__ import masks", repeat = reps, number = number_iter))
)
print 'Masks2:'
print np.average(
np.array(it.repeat("masks2()", setup="from __main__ import masks2", repeat = reps, number = number_iter))
)
print 'Intersect:'
print np.average(
np.array(it.repeat("intersect()", setup="from __main__ import intersect", repeat = reps, number = number_iter))
)
你为什么需要两个面具?既然
30>-9999.0
,VAL>30是否足够?