检测numpy-3D阵列中的极端(最远)点

时间:2016-05-02 07:27:00

标签: python arrays numpy scipy

我有一个大型numpy 3D阵列(45900,3,3)。在该阵列的每个3x3子集中,我有一个具有唯一ID的群集(群集的值大于0)。我的挑战是找到每个子集中每个群集的“极值点”。对于“极端点”,我指的是群集中距离最远的两个点。 因此,它与这些点的值无关,只与位置有关。

示例子集是:

numpy3D= array([[[1, 1, 1],
[0, 0, 0],
[0, 0, 0]],

[[0, 0, 2],
[0, 0, 2],
[0, 0, 2]],

[[3, 3, 3],
[3, 0, 0],
[0, 0, 0]],

[[4, 0, 0],
[0, 4, 0],
[0, 0, 4]]])

作为输出,我想要一个表示'极值点'的x,y和z坐标的数组。

例如:

#output
array([[ 0., 0., 0.],
[ 0., 0., 2.],
[ 1., 0., 2.],
[ 1., 2., 2.],
[ 2., 1., 0.],
[ 2., 0., 2.],
[ 3., 0., 0.],
[ 3., 0., 2.],
[ 4., 0., 0.],
[ 4., 2., 2.]])

其中第一列表示子集位置,第二列表示每个极值点的x和y坐标。所以在这种情况下,numpy3D [0,0,0]是第一个3x3子集中第一个极点的坐标,numpy3D [0,0,2]是该子集中第二个极点的坐标。

关于这个问题的任何想法?

1 个答案:

答案 0 :(得分:1)

numpy_indexed包(免责声明:我是它的作者)可用于以优雅和矢量化的方式解决这个问题:

import numpy_indexed as npi
idx = np.indices(numpy3D.shape).reshape(numpy3D.ndim, numpy3D.size)
groups = npi.group_by(numpy3D, axis=None)
label, min = groups.min(idx, axis=1)
label, max = groups.max(idx, axis=1)

请注意,创建分组对象是此计算中最昂贵的部分;之后对这些群体进行各种不同的减少是一项微不足道的操作。