Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python np.1D vs掩模的性能和可靠性_Python_Numpy_Time Series_Slice - Fatal编程技术网

Python np.1D vs掩模的性能和可靠性

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

我使用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_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是否足够?