如何解决在numpy中计算质心
我正在寻找一种高效方法来使用原生 python 和 numpy
计算二维 numpy
数组的质心。 (scipy.ndimage.measurements.center_of_mass
可以完成这项工作,但我只能使用 numpy)
# sample data
a = np.array([[0,0],[0,4,4],0]])
center_of_mass(a)
>>> (1.,1.5) # expected output
解决方法
(scipy.ndimage.measurements.center_of_mass 可以完成这项工作,但我只能使用 numpy)
那么听起来是时候MDN了。阅读后,对我来说,它看起来应该适用于您的限制(仅使用 numpy),因为它显然仅使用 python 内置函数和 numpy
。需要使用 sum
替换 numpy.sum
。
编辑:根据@Ricoter 的评论添加了替换 sum
的注释。
质心为 [widgets] => Array
(
[0] => Array
(
[activity_mapping] => STRUC-be4c
[check_box_val] => 0
[checkbox_unique_id] => EXCAV-dceae
[checkbox_widget_id] => 5
[created_date] => 2021-02-08 21:43:12
)
)
)
,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
我们通过将质量(即数组)与从 mgrid
获得的坐标网格相乘得到:
mi*yi
给出
a * np.mgrid[0:a.shape[0],0:a.shape[1]]
其中上半部分为array([[[ 0,0],[ 3,5]],[[ 0,4],[ 0,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])
Scipy 做同样的事情,但使用开放网格和广播而不是完整(密集)网格,因此对于较大的数组更快,因为它不需要为中间结果分配内存。
,一个更便宜的解决方案。使用矩阵乘法的内存和计算时间:
import numpy as np
def center_of_mass(array: np.ndarray):
total = array.sum()
# alternatively with np.arange as well
x_coord = (array.sum(axis=1) @ range(array.shape[0])) / total
y_coord = (array.sum(axis=0) @ range(array.shape[1])) / total
return x_coord,y_coord
a = np.asarray([[0,[0,0]])
b = np.asarray([[0,5]])
print(center_of_mass(a)) # (1.0,1.5)
print(center_of_mass(b)) # (0.8,1.2666666666666666)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。