在numpy中计算质心

里科特

我在寻找一个有效的方式来计算中心的质量二维的numpy使用本地Python和阵列numpyscipy.ndimage.measurements.center_of_mass完成这项工作,但我只能使用 numpy)

# sample data
a = np.array([[0, 0, 0],
              [0, 4, 4],
              [0, 0, 0]])

center_of_mass(a)
>>> (1., 1.5) # expected output
斯特夫

质心是sum(mi * xi)/msum(mi * yi)/m其中mi是质量(= 数组的元素)xiyi是坐标(数组的索引)。m是总质量,即sum(mi)

示例a = np.array([[0,1,2],[3,4,5]])

mi*ximi*yi我们从群众中(即阵列)从得到的坐标格相乘得到mgrid

a * np.mgrid[0:a.shape[0], 0:a.shape[1]]

这使

array([[[ 0,  0,  0],
        [ 3,  4,  5]],

       [[ 0,  1,  4],
        [ 0,  4, 10]]])

其中上半部分为mi*yi,下半部分为mi*xi,其总和为

(a * np.mgrid[0:a.shape[0], 0:a.shape[1]]).sum(1).sum(1)

这给array([12, 19]).

将其除以总和,a.sum()我们得到 的最终结果array([0.8, 1.26666667])

综上所述,我们有:

(a * np.mgrid[0:a.shape[0], 0:a.shape[1]]).sum(1).sum(1)/a.sum()

Scipy 做同样的事情,但使用开放网格和广播而不是完整(密集)网格,因此对于更大的数组更快,因为它不需要为中间结果分配内存。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章