我正在使用numpy来处理具有多个bad_values = -9999.0的时间序列。例如:
vals = [3.,352。, - 32.0e-3,-9999.0,35,-9999.0]
我有许多不同的条件,值必须符合我的条件才能接受。一个这样的削减可能是我的所有值都必须大于30.将> 30 条件与 bad_value 条件相结合的最合适的方法是什么?
我可以看到两种可能性:
1)使用面具:
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)交叉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]
我组合了许多不同类型的 vals 的重复计算,每个 vals 都有不同的bad_vals。这个版本的一个版本比另一个更好吗?一个更有效还是更强大?
答案 0 :(得分:1)
假设您的数据是一维的,您可以直接在切片值中使用蒙版:
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))
)