作为一种方法,我们可以获得非零索引并获得它们的平均值作为质心,就像这样 -
np.flatnonzero(x).mean()
这是另一种方法,使用移位数组比较来获取该切片的开始和停止索引,并获取这些索引的平均值以确定质心,就像这样 -
np.flatnonzero(x[:-1] != x[1:]).mean()+0.5
运行时测试-
In [72]: x = np.zeros(10000,dtype=int)
In [73]: x[100:2000] = 1
In [74]: %timeit np.flatnonzero(x).mean()
10000 loops, best of 3: 115 µs per loop
In [75]: %timeit np.flatnonzero(x[:-1] != x[1:]).mean()+0.5
10000 loops, best of 3: 38.7 µs per loop
我们可以通过使用np.nonzero()[0] 替换np.flatnonzero 和np.sum 来代替np.mean 来提高性能 -
In [107]: %timeit (np.nonzero(x[:-1] != x[1:])[0].sum()+1)/2.0
10000 loops, best of 3: 30.6 µs per loop
另外,对于第二种方法,我们可以存储开始和停止索引,然后简单地将它们相加以获得质心,这样可以避免对np.mean 的函数调用,就像这样 -
start,stop = np.flatnonzero(x[:-1] != x[1:])
out = (stop + start + 1)/2.0
时间安排 -
In [90]: %timeit start,stop = np.flatnonzero(x[:-1] != x[1:])
10000 loops, best of 3: 21.3 µs per loop
In [91]: %timeit (stop + start + 1)/2.0
100000 loops, best of 3: 4.45 µs per loop
同样,我们可以在这里试验np.nonzero()[0]。