python:计算质心

python:计算质心,python,numpy,centering,Python,Numpy,Centering,我有一个包含4列的数据集:x、y、z和value,假设: 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.cen

我有一个包含4列的数据集:x、y、z和value,假设:

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\u of_mass
似乎是正确的,但不幸的是,该函数总是返回两个值(而不是3)。此外,我找不到任何关于如何从数组中设置
ndimage
的文档:我会使用形状为
(9,4)
的numpy数组N吗?那么N[:,0]是x坐标吗

非常感谢您的帮助。

您觉得:

#                   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]))

我能想到的最简单的方法是:求质量分量坐标的平均值,每个分量的贡献加权

import numpy
masses = 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]])

nonZeroMasses = masses[numpy.nonzero(masses[:,3])] # Not really necessary, can just use masses because 0 mass used as weight will work just fine.

CM = numpy.average(nonZeroMasses[:,:3], axis=0, weights=nonZeroMasses[:,3])

另一个选项是使用scipy重心:

from scipy import ndimage
import numpy

masses = 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(masses)

对不起,这里的价值有什么意义?这是弥撒吗?所以实际上你想要的是
[1 1 1 0 1][1 2 0 1]
的平均值?好吧,为什么不编写一个函数来实现这一点呢?这是一个微不足道的数学问题。它没有返回值,似乎没有正确的乘法维数,如果我修正了这些维数,它似乎就不会给出正确的答案。我遗漏了什么?我忘记了
np.average
接受了权重参数!这是一个很好的答案,谢谢!