加速Numpy掩蔽

2024-04-28 10:17:31 发布

您现在位置:Python中文网/ 问答频道 /正文

在考虑如何进行优化时,我还是个天才。我有这段代码,它接收一个找到的峰值列表,并找到这些峰值,+/-一些值,在多维数组中的位置。然后将它们的零数组索引加上+1。代码运行良好,但执行起来需要很长时间。例如,如果ind有270个值,而refVals的形状是(30503130,80),那么运行大约需要45分钟。我知道有很多数据需要处理,但是有没有更有效的方法来处理呢?你知道吗

maskData = np.zeros_like(refVals).astype(np.int16)

for peak in ind:
        tmpArr = np.ma.masked_outside(refVals,x[peak]-2,x[peak]+2).astype(np.int16)
        maskData[tmpArr.mask == False  ] += 1
        tmpArr = None

maskData = np.sum(maskData,axis=2)

Tags: 代码列表np数组天才ind峰值astype
1条回答
网友
1楼 · 发布于 2024-04-28 10:17:31

方法#1:如果内存允许,这里有一个使用^{}-

# Craate +,-2 limits usind ind
r = x[ind[:,None]] + [-2,2]

# Use limits to get inside matches and sum over the iterative and last dim
mask = (refVals >= r[:,None,None,None,0]) & (refVals <= r[:,None,None,None,1])
out = mask.sum(axis=(0,3))

方法#2:如果前一个内存不足,我们可以使用循环和NumPy布尔数组,这可能比屏蔽数组更有效。此外,我们还将执行一个更高级别的sum-reduction,以便在迭代过程中拖动更少的数据。因此,可供选择的实现方式如下所示-

out = np.zeros(refVals.shape[:2]).astype(np.int16)
x_ind = x[ind]
for i in x_ind:
    out += ((refVals >= i-2) & (refVals <= i+2)).sum(-1)

方法#3:或者,我们可以用方法#2中的^{}替换基于限制的比较。因此,循环中的唯一步骤将变成-

out += np.isclose(refVals,i,atol=2).sum(-1)

相关问题 更多 >