通过接近度将3D numpy数组中的单元格分组的最佳方法

时间:2014-03-13 14:34:10

标签: numpy

我试图找到查找/设置3D位置周围所有单元格的最佳方法。这是一种聚类问题。我想聚集一些群体'在几个特定地点附近的细胞。

例如,给定单元格距离为2,(4,4,4)的3D数组和3D位置列表:

(0, 0, 0)
(0, 2, 0)
(3, 0, 0)

假设给定的数组全为零。

我希望返回一个3D阵列,该阵列在距离任何位置2的单元格距离内的所有单元格中都有1个。

因此,距离上述位置2个或更少的任何单元格(包括位置本身)都应该有1个。

我想使用numpy切片而不是Python for循环来提高性能。

以下是输入和输出示例:

distance = 2
shape = (4, 4, 4)
locations = [(2, 0, 0)]

返回应该是:

array([[[1, 1, 1, 0],
        [1, 1, 1, 0],
        [1, 1, 1, 0],
        [0, 0, 0, 0]],

       [[1, 1, 1, 0],
        [1, 1, 1, 0],
        [1, 1, 1, 0],
        [0, 0, 0, 0]],

       [[1, 1, 1, 0],
        [1, 1, 1, 0],
        [1, 1, 1, 0],
        [0, 0, 0, 0]],

       [[1, 1, 1, 0],
        [1, 1, 1, 0],
        [1, 1, 1, 0],
        [0, 0, 0, 0]]], dtype=int32)

基本上,在中心周围形成一个大小为2x2x2的立方体。点(2,0,0)

1 个答案:

答案 0 :(得分:1)

这样做你想要的吗?

import numpy as np

distance = 2
shape = (4, 4, 4)
locations = np.array([(2, 0, 0)])

data = np.zeros(shape, np.int)

data[locations[:,0], locations[:,1], locations[:,2]] = 1

import scipy.ndimage
scipy.ndimage.binary_dilation(data, np.ones((3,3,3)), 2)