np.intersect1d与掩码的性能和可靠性

时间:2015-03-03 19:40:42

标签: python numpy time-series slice

我正在使用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。这个版本的一个版本比另一个更好吗?一个更有效还是更强大?

谢谢!

1 个答案:

答案 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))
    )