2017-12-30 6 views
1

셀을 구성하는 상자를 모델링하기 위해 2D/3D numpy 배열을 사용합니다. 세포를 0부터 증가하는 숫자로 표시되어 여기까지, 이것은 n_cells이 상자가 각 차원이 있어야 세포, 기본적으로 치수의 수를 저장하는 np.array이 어디경계를 둘러싼 다차원 배열의 요소에 대해 "이웃"을 모두 찾습니다.

box = np.arange(np.prod(n_cells)) 
box = box.reshape(n_cells) 

수행 할 수 세포에서 세어 상자의.

이제 나를위한 어려운 부분은 각 셀에 대한 이웃을 찾는 지능적인 방법을 찾는 것입니다. 내 목표는 어레이 또는 각 셀에 이웃을 포함하는 목록을 설정하는 것입니다. 이상적으로는 작은 2D 예제를 살펴 보는 것이 이상적입니다.

0: 1, 4, 5, 3, 7, 12, 13, 15 
1: 0, 2, 4, 5, 6, 12, 13, 14 

이 방법은 모든 요소가 갖도록 이웃

0: 1, 4, 5 
1: 0, 2, 4, 5, 6 
2: 1, 5, 6, 7, 3 
... 

하지만주기적인 경계 조건을 가지고 싶습니다있는주기적인 경계 조건없이 여기

0 1 2 3 
4 5 6 7 
8 9 10 11 
12 13 14 15 

, 2D에서 8 이웃. 이상적으로 모든 치수에 대해 이러한 목록/배열을 만들 수 있기를 원하지만 일반화 된 솔루션을 사용할 수없는 경우 특히 2D/3D에 관심이 있습니다.

또 다른 문제는 내가 이렇게해야한다는 것입니다. 나는 모든 쌍을 두 번 계산합니다. 즉 0은 1의 이웃이고 1은 0의 이웃입니다. 이것은 무언가입니다. 잘하지만 그것은 주요 문제가 아닙니다.

+0

좋아요? https://stackoverflow.com/a/34908879/8881141 또는이 정보가 필요하십니까? https://stackoverflow.com/a/2373689/8881141 – MrT

+0

[ndarray에서 셀의 이웃을 찾는 방법?] (https : // stackoverflow.com/questions/34905274/how-to-find-the-neighbors-of-a-cell-in-an-ndarray) –

+0

Thx, 이것이 원하는 방향으로 간다. 그러나 주기성을 주소 지정하지 않는다. – Marsl

답변

2

numpy.roll은 원하는 축약 형으로 축을 따라 배열을 "롤링"하여 수행 할 수 있습니다. 예를 들어,에 의해 압연 (-1, -1)를 왼쪽에 모든 이동, 그래서 배열이 이러한 방법으로

[[ 5, 6, 7, 4], 
    [ 9, 10, 11, 8], 
    [13, 14, 15, 12], 
    [ 1, 2, 3, 0]] 

이되고, 우리는 단지 모든 지점의 남쪽 - 동쪽 이웃을 발견했다. 이 목록 (ravel)을 평평하게 유지하고 9 개의 오프셋 (숫자 자체를 의미하는 (0, 0) 포함) 각각에 대해 프로세스를 반복하고 결과를 스택에 저장합니다. 나머지는 이웃하며, 첫 번째 엔트리는 원래의 수이고, 각 행

[[ 0, 1, 3, 4, 5, 7, 12, 13, 15], 
    [ 1, 2, 0, 5, 6, 4, 13, 14, 12], 
    [ 2, 3, 1, 6, 7, 5, 14, 15, 13], 
    [ 3, 0, 2, 7, 4, 6, 15, 12, 14], 
    [ 4, 5, 7, 8, 9, 11, 0, 1, 3], 
    [ 5, 6, 4, 9, 10, 8, 1, 2, 0], 
    [ 6, 7, 5, 10, 11, 9, 2, 3, 1], 
    [ 7, 4, 6, 11, 8, 10, 3, 0, 2], 
    [ 8, 9, 11, 12, 13, 15, 4, 5, 7], 
    [ 9, 10, 8, 13, 14, 12, 5, 6, 4], 
    [10, 11, 9, 14, 15, 13, 6, 7, 5], 
    [11, 8, 10, 15, 12, 14, 7, 4, 6], 
    [12, 13, 15, 0, 1, 3, 8, 9, 11], 
    [13, 14, 12, 1, 2, 0, 9, 10, 8], 
    [14, 15, 13, 2, 3, 1, 10, 11, 9], 
    [15, 12, 14, 3, 0, 2, 11, 8, 10]] 

:

dim = len(b.shape)  # number of dimensions 
offsets = [0, -1, 1]  # offsets, 0 first so the original entry is first 
columns = [] 
for shift in itertools.product(offsets, repeat=dim): # equivalent to dim nested loops over offsets 
    columns.append(np.roll(b, shift, np.arange(dim)).ravel()) 
neighbors = np.stack(columns, axis=-1) 

출력 (neighbors의 값) : 용액 배열 b 임의의 측정 기준에 대해 작동한다.

당신은 NaN이 함께 예를 들어, 중복 항목을 마스크 수, 한 번만 나열된 각 항목 이웃 쌍을 가지고 :

np.where(neighbors >= neighbors[:, [0]], neighbors, np.nan) 

    [[ 0., 1., 3., 4., 5., 7., 12., 13., 15.], 
    [ 1., 2., nan, 5., 6., 4., 13., 14., 12.], 
    [ 2., 3., nan, 6., 7., 5., 14., 15., 13.], 
    [ 3., nan, nan, 7., 4., 6., 15., 12., 14.], 
    [ 4., 5., 7., 8., 9., 11., nan, nan, nan], 
    [ 5., 6., nan, 9., 10., 8., nan, nan, nan], 
    [ 6., 7., nan, 10., 11., 9., nan, nan, nan], 
    [ 7., nan, nan, 11., 8., 10., nan, nan, nan], 
    [ 8., 9., 11., 12., 13., 15., nan, nan, nan], 
    [ 9., 10., nan, 13., 14., 12., nan, nan, nan], 
    [ 10., 11., nan, 14., 15., 13., nan, nan, nan], 
    [ 11., nan, nan, 15., 12., 14., nan, nan, nan], 
    [ 12., 13., 15., nan, nan, nan, nan, nan, nan], 
    [ 13., 14., nan, nan, nan, nan, nan, nan, nan], 
    [ 14., 15., nan, nan, nan, nan, nan, nan, nan], 
    [ 15., nan, nan, nan, nan, nan, nan, nan, nan]]) 

아이디어입니다 neighbors >= neighbors[:, [0]] 만 나열 세포 자체보다 더 큰 수를 가진 사람들 .

+0

제품은 반복적 인 인수를 사용합니다 (조금 더 명확합니다) – Eric

+0

그렇게 간결한 방식으로 찾고 있던 것을 정확히 고맙게 생각합니다. – Marsl

관련 문제