2014-03-13 22 views
1

我試圖找到找到/設置圍繞3D位置的所有單元格的最佳方法。這是一種聚類問題。我想圍繞幾個特定位置將「小組」組合在一起。通過接近對3D numpy陣列中的單元格進行分組的最佳方法

例如,給定的2的小區的距離,的3D陣列(4,4,4),和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

這是做你想做的嗎?

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) 
+0

我試了一下,看起來正確。但是,我不太瞭解np.ones(3,3,3)和binary_dilation的情況。你能提供一個外行人的描述嗎? scipy文檔有點密集。它看起來像np.ones(3,3,3)是需要的'立方體'的大小。所以它應該取決於距離嗎? –

+0

@ durden2.0見http://homepages.inf.ed.ac.uk/rbf/HIPR2/dilate.htm – YXD

+0

@MrE謝謝,看起來我有一些閱讀要做! –

相關問題