我在寻找一个有效的方式来计算中心的质量二维的numpy
使用本地Python和阵列numpy
。(scipy.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)/m
,sum(mi * yi)/m
其中mi
是质量(= 数组的元素)xi
,yi
是坐标(数组的索引)。m
是总质量,即sum(mi)
。
示例a = np.array([[0,1,2],[3,4,5]])
:
mi*xi
而mi*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] 删除。
我来说两句