【问题标题】:Python - Best way to find the 1d center of mass in a binary numpy arrayPython - 在二进制 numpy 数组中找到 1d 质心的最佳方法
【发布时间】:2017-02-04 18:13:42
【问题描述】:

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

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

我想找到1 元素的一维质心的索引。我可以输入以下内容:

idx = np.where( x )[0]
idx_center_of_mass = int(0.5*(idx.max() + idx.min()))
# this would give 5

(当然,当1s 切片的元素数量为偶数时,这会导致粗略的近似。) 有没有更好的方法来做到这一点,比如计算效率更高的 oneliner?

【问题讨论】:

    标签: python arrays numpy binary boolean


    【解决方案1】:

    作为一种方法,我们可以获得非零索引并获得它们的平均值作为质心,就像这样 -

    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.flatnonzeronp.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]

    【讨论】:

      【解决方案2】:

      您不能简单地执行以下操作吗?

      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
      

      【讨论】:

        猜你喜欢
        • 2016-12-20
        • 2013-12-12
        • 1970-01-01
        • 1970-01-01
        • 2013-08-19
        • 1970-01-01
        • 2014-10-28
        • 1970-01-01
        • 2021-10-13
        相关资源
        最近更新 更多