python:计算质心

Fel*_*lix 2 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
Run Code Online (Sandbox Code Playgroud)

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

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

任何帮助都非常感谢.

Ale*_*tke 8

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

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])
Run Code Online (Sandbox Code Playgroud)

  • 我忘了`np.average`接受了一个权重参数! (2认同)

Bac*_*old 5

另一种选择是使用 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)
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的答案,谢谢! (2认同)