【问题标题】:Detect extreme (most distant) points in numpy-3D array检测 numpy-3D 数组中的极端(最远)点
【发布时间】:2016-05-02 07:26:59
【问题描述】:

我有一个大型 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] 是该子集中第二个极值点的坐标。

对这个问题有什么想法吗?

【问题讨论】:

  • “这个数组的每个二维子集”是什么意思?
  • 例如,您将获得的 3 x 3 2d 数组:numpy3D[0]
  • 但是 3 x 3 将是 x,y,z 坐标,而不是 x,y。
  • 你是对的!所以我需要的是子集位置的 x 坐标和极值点的 y,z 坐标。我将编辑我的问题。
  • 这些 3x3 2D 矩阵代表什么?

标签: python arrays numpy scipy


【解决方案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)

请注意,创建 group-by 对象是此计算中最昂贵的部分;之后对这些组执行各种不同的归约是一项微不足道的操作。

【讨论】:

  • 非常感谢,这正是我需要的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
  • 2016-10-30
  • 2021-05-05
  • 2017-01-13
  • 2021-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多