迭代元素,找到每个元素的最小值

时间:2015-12-09 15:41:38

标签: python numpy

第一次发帖,所以我为任何困惑道歉。

我有两个numpy数组,它们是信号的时间戳。

chan1,chan2看起来像:

911.05, 7.7
1055.6, 455.0
1513.4, 1368.15
4604.6, 3004.4
4970.35, 3344.25
13998.25, 4029.9
15008.7, 6310.15
15757.35, 7309.75
16244.2, 8696.1
16554.65, 9940.0
...,   ...

依此类推,(每个chan。前文件最多65000个元素) 编辑:列表已经排序,但问题是它们的间距并不总是相等。可能会出现间隙,这会使它们不对齐,所以chan1 [3]可能更接近chan2 [23]而不是,如果间距是qual chan2 [2或3或4]:结束编辑

对于chan1中的每个元素,我有兴趣在chan2中找到最近的邻居,这完成了:

$ np.min(np.abs(chan2-chan1[i]))

并跟踪正面或负面。差:

$ index=np.where( np.abs( chan2-chan1[i]) == res[i])[0][0]
$ if chan2[index]-chan1[i] <0.0 : res[i]=res[i]*(-1.0)

最后,我在我感兴趣的范围内创建所有差异的直方图。

我担心的是我在for循环中执行此操作。我通常会尝试通过利用numpy数组避免for循环,因为每个操作都可以在整个数组上执行。但是,在这种情况下,我无法找到解决方案或内置功能(我理解它比我能做的任何事情都快得多)。 该例程每个文件大约需要0.03秒。还有一些事情发生在函数之外,但不是一个重要的数字,主要是在完成所有事情后绘图,以及读取文件的循环。

我想知道是否有人遇到类似问题,或者熟悉python库以建议解决方案(可能是构建函数?)来获取我感兴趣的数据?我必须浏览数十万个文件,目前我的数据分析速度比数据采集慢10个左右。我们也正在将我们的仪器升级到能够以10-100倍的速度获得数据的地方,因此分析速度将成为一个严重的问题。

我宁愿不使用群集来强制解决问题,也不太熟悉并行处理,尽管我不介意涉及它。用C语言编写它需要一段时间,而且我不确定我是否能够更快地完成它。

提前感谢您的帮助。

 def gen_hist(chan1,chan2):
     res=np.arange(1,len(chan1)+1,1)*0.0
     for i in range(len(chan1)):
         res[i]=np.min(np.abs(chan2-chan1[i]))
         index=np.where( np.abs( chan2-chan1[i]) == res[i])[0][0]
         if chan2[index]-chan1[i] <0.0 : res[i]=res[i]*(-1.0)
     return np.histogram(res,bins=np.arange(time_range[0]-interval,\
                                            time_range[-1]+interval,\
                                            interval))[0] 

在循环完所有文件之后,我获得了一个数据图: enter image description here

1 个答案:

答案 0 :(得分:0)

你的问题有点模糊,但我假设,给定两个排序数组,你试图返回一个数组,其中包含第一个数组的每个元素与第二个数组中最接近的值之间的差异。 / p>

您的算法的最差情况为O(n^2)np.where()np.min()O(n))。我会通过使用两个迭代器而不是一个来解决这个问题。您存储右数组的先前(r_p)和当前(r_c)值以及左数组的当前(l_c)值。对于左数组的每个值,将右数组递增到r_c > l_c。然后将min(abs(r_p - l_c), abs(r_c - l_c))附加到您的结果中。

在代码中:

l = [ ... ]
r = [ ... ]
i = 0
j = 0
result = []
r_p = r_c = r[0]
while i < len(l):
    l_c = l[i]
    while r_c < l and j < len(r):
        j += 1
        r_c = r[j]
        r_p = r[j-1]
    result.append(min(abs(r_c - l_c), abs(r_p - l_c)))
    i += 1

这在O(n)中运行。如果您需要更快的速度,请尝试writing it in C或在Cython中运行。