Python在二进制numpy数组中找到1d质心的最佳方法

2024-03-28 22:58:04 发布

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

假设我有下面的Numpy数组,其中我只有一个连续的1s切片:

import numpy as np
x = np.array([0,0,0,0,1,1,1,0,0,0], dtype=1)

我想找到1元素的一维质心指数。我可以键入以下内容:

^{pr2}$

(当然,当1s切片的元素数为偶数时,这将导致粗略近似。) 有没有更好的方法可以做到这一点,比如计算效率更高的一行程序?在


Tags: importnumpy元素键入asnp切片数组
2条回答

作为一种方法,我们可以得到非零指数,并得到这些指数的平均值作为质心,如下-

np.flatnonzero(x).mean()

这是另一种方法,使用移位数组比较来获得该切片的开始和停止索引,并获得这些索引的平均值,以确定质心,如下-

^{pr2}$

运行时测试-

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和{}代替{}-

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]进行实验。在

你不能简单地做下面的事吗?在

center_of_mass = (x*np.arange(len(x))).sum()/x.sum() # 5

%timeit center_of_mass = (x*arange(len(x))).sum()/x.sum()
# 100000 loops, best of 3: 10.4 µs per loop

相关问题 更多 >