Python中center函数:python:计算质心

我有 4 列的数据集:x,y,z 和值,让我们说:

x  y  z  value
0  0  0  0
0  1  0  0
0  2  0  0
1  0  0  0
1  1  0  1
1  2  0  1
2  0  0  0
2  1  0  0
2  2  0  0

我想计算所有值的质心CM = (x_m,y_m,z_m),在本例中,我想看到(1,1.5,0)作为输出。

我认为这一定是一个微不足道的问题,但我在互联网上找不到它的解决方案。scipy.ndimage.measurements.center_of_mass似乎是正确的事情,但不幸的是,该函数总是返回两个值 (而不是 3)。此外,我找不到有关如何从数组中设置ndimage的任何文档:我会使用形状(9,4)的 numpy 数组 N 吗?然后:0

任何帮助是高度赞赏。

14

我能想到的最简单的方法是:只需找到由每个组件的贡献加权的质量组件的坐标的平均值。

import numpy
m = numpy.array([[0,  0,  0,  0],
[0,  1,  0,  0],
[0,  2,  0,  0],
[1,  0,  0,  0],
[1,  1,  0,  1],
[1,  2,  0,  1],
[2,  0,  0,  0],
[2,  1,  0,  0],
[2,  2,  0,  0]])
nonZeroM = m[numpy.nonzero(m[:,3])] # Not really necessary, can just use m because 0 mass used as weight will work just fine.
CM = numpy.average(nonZeroM[:,:3], axis=0, weights=nonZeroM[:,3])
5

另一种选择是使用 scipy 质心:

from scipy import ndimage
import numpy
m = numpy.array([[0,  0,  0,  0],
[0,  1,  0,  0],
[0,  2,  0,  0],
[1,  0,  0,  0],
[1,  1,  0,  1],
[1,  2,  0,  1],
[2,  0,  0,  0],
[2,  1,  0,  0],
[2,  2,  0,  0]])
ndimage.measurements.center_of_mass(m)
2

怎么样:

#                   x      y     z  value
table = np.array([[ 5. ,  1.3,  8.3,  9. ],
                  [ 6. ,  6.7,  1.6,  5.9],
                  [ 9.1,  0.2,  6.2,  3.7],
                  [ 2.2,  2. ,  6.7,  4.6],
                  [ 3.4,  5.6,  8.4,  7.3],
                  [ 4.8,  5.9,  5.7,  5.8],
                  [ 3.7,  1.1,  8.2,  2.2],
                  [ 0.3,  0.7,  7.3,  4.6],
                  [ 8.1,  1.9,  7. ,  5.3],
                  [ 9.1,  8.2,  3.3,  5.3]])
def com(xyz, mass):
    mass = mass.reshape((-1, 1))
    return (xyz * mass).mean(0)
print(com(table[:, :3], table[:, 3]))
1

为什么ndimage.measurements.center_of_mass没有给出预期的结果?

关键是输入数据m如何由 4 元组(x,y,z,值)的数组表示

# x   y   z   value
[[0,  0,  0,  0],
 [0,  1,  0,  0],
 [0,  2,  0,  0],
 [1,  0,  0,  0],
 [1,  1,  0,  1],
 [1,  2,  0,  1],
 [2,  0,  0,  0],
 [2,  1,  0,  0],
 [2,  2,  0,  0]]

这里的数组m表示每个质量的 3-D 位置和权重。但是请注意,这个 python 数组结构只是一个 2-D 数组。它的形状是 (9,4)。

您需要传递给 ndimage 以获得预期结果的输入是一个 3-D 数组,其中包含零,并且每个质量的权重在数组中的适当坐标处,如下所示:

from scipy import ndimage
import numpy
m = numpy.zeros((3, 3, 1))
#      x  y  z    value
m[1, 1, 0] = 1
m[1, 2, 0] = 1
CM = ndimage.measurements.center_of_mass(m)
#  x    y    z
# (1.0, 1.5, 0.0)

这正是预期的输出。

注意这个解决方案(和 ndimage 库)的限制是它需要非负整数坐标。对于大和 / 或稀疏卷也不会有效,因为 ndimage 的每个“像素”需要在内存中实例化。

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(95)
Python中reverse函数:Python.reverse()和.extend()
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(29条)