微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在numpy中计算质心

如何解决在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 举报,一经查实,本站将立刻删除。