我有一个包含 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 吗? 那么 N[:,0] 会是 x 坐标吗?

任何帮助都受到高度赞赏。

#1楼 票数:11 已采纳

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

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

#2楼 票数:4

另一种选择是使用 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)

#3楼 票数: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]))

#4楼 票数:0

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

关键在于输入数据masses如何由 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]]

此处的阵列masses代表每个质量的 3-D 位置和权重。 但是请注意,这个 python 数组结构只是一个二维数组。 它的形状是 (9, 4)。

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

from scipy import ndimage
import numpy

masses = numpy.zeros((3, 3, 1))
#      x  y  z    value
masses[1, 1, 0] = 1
masses[1, 2, 0] = 1

CM = ndimage.measurements.center_of_mass(masses)
#  x    y    z
# (1.0, 1.5, 0.0)

这正是预期的输出。

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

  ask by Felix translate from so

未解决问题?本站智能推荐:

3回复

如何在python中居中二进制图像的内容/对象?

我有一个计算图形方向的代码。 然后根据这个方向旋转图形,直到它被拉直。 这一切正常。 我正在努力解决的是将旋转图形的中心移到整个图像的中心。 所以图形的中心点应该与整个图像的中心点相匹配。 输入图像: 代码: 有输出: 如您所见,白色图形略微偏左,我希望它完全居中。 有谁知道如何做到
2回复

如何计算python中的质心

我是python编码的初学者。 我正在研究结构坐标。 我有pdb结构,它有xyz坐标信息(最后三个col) 我的结构中有1000个原子。 我有两个问题。 我如何从xyz坐标计算结构的质心。 从质心我想画一个半径为20厘米的球体。 它给出了每个原子的质心
5回复

如何在python中计算多个地理位置的中点

是否有图书馆或一种方法来计算多个地理位置点的中心点? 这是我在纽约的地理位置列表,我想找到大概的中点地理位置
3回复

在numpy中计算质心

我正在寻找一种使用本机 python 和numpy计算二维numpy数组的质心的有效方法。 ( scipy.ndimage.measurements.center_of_mass完成这项工作,但我只能使用 numpy) # sample data a = np.array([[0, 0, 0],
4回复

在python中计算矩形的质心

我想计算矩形的质心,矩形的坐标如下: 有人可以指出一个简单的方法。 谢谢
1回复

中心文本与变量python3.6

首先,我是一般的编程新手,所以这意味着我也是python的新手,所以慢慢输入以便我能跟上。 我试图将一行文本居中,其中包含用户输入的变量。 像这样的东西: 我尝试了尽可能多的方法来使整个线路读取居中。 。 。 你今年40岁。 (当然,假设用户输入= 40)没有运气。 我究竟
2回复

使用Python减去数据框中每列的平均值

我正在寻找一种方法来查找python数据帧中每列的方法,并用该列的平均值减去该列。 假设我有: 我想找到每列的平均值,它将返回(2,1.5,1)并分别减去a , b和c列的值。 会给出, ((-0.5,0.5),(-1.25, 1.5), (0.25,-0.25)) 有
1回复

Python中的图像处理(计算节点之间的图形边缘距离(区域质心)

我需要对图像进行二值化处理并计算选定的微血管(黑褐色),然后将图像阵列拆分为100个相等的部分,并在这些图像区域中设置质心(黑色像素的最大和最小数目),并计算节点之间的图边距离在这些中心。 是否有人有经验并知道在Python中使用什么功能? 这是开始代码: 非常感谢