2014-03-07 3 views
1

저는 numpy 배열을 가진 직립 정사각형 격자를 나타냅니다 (하나의 요소는 위의 하나, 아래의 오른쪽, 왼쪽에는 대각선으로 연결되어 있지 않음). 격자에서 임의의 요소를 선택하고 그 값을 임의의 인접 요소의 값으로 변경해야합니다. 이 작업을 수행하는 간단한 방법이 있습니까?numpy 배열에서 인접 요소 선택

현재 가장 좋은 아이디어는 행과 열 인덱스에서 무작위로 추출한 다음 엘리먼트에 네 개의 이웃이있는 경우 시도한 다음 왼쪽이 누락 된 경우 오른쪽으로, 그 다음 위로 가기, 그리고 마지막으로 네 가지를 시도하는 것입니다. 모서리. 이것은 정말로 성가신 것 같습니다. 무작위로 격자에 분산 내 데이터가 -1

, + 1 :

lattice=np.random.uniform(low=0.0, high=1.0, size=[30,30]) 
lattice[lattice<0.2]=-1 
lattice[lattice>0.2]=1 

그래서 그때로 반환 된 격자를 기대하고있어, 임의의 요소가 lattice[0,0]라고

lattice[0,0]=np.random.choice([lattice[0,1], lattice[1,0]]) 

편집 : 이전에 오해의 소지가있는 복수형을 사용하여 죄송합니다.

+2

데이터가 무엇처럼 보이는입니까? 몇 가지 샘플 입력과 예상 출력을 제공합니다 – zhangxaochen

+0

한 번에 하나씩 또는 한 번에 하나씩 모든 요소에 대해이 작업을 수행 하시겠습니까? – YXD

답변

1

scipy.ndimage.generic_filter을 사용하여 각 요소 주위에 3x3 격자를 선택하여 선택한 함수에 전달합니다. 이 함수는 인접한 임의의 요소를 선택합니다.
테두리 (원래 배열 외부의 값)는 nan으로 설정되고 우리는 유효한 요소에서 선택하기 위해 함수에서 nan을 필터링합니다.

import numpy as np 
import scipy.ndimage as ndimage 


def random_function(arr, **kwargs): 
    from random import choice 
    mask = ~np.isnan(arr) & kwargs['mask'] 
    return choice(arr[mask]) 

n = 5 
array = np.arange(n ** 2).reshape((n, n)) 
cross_mask = np.zeros(9).astype(bool) 
cross_mask[[1, 3, 5, 7]] = True 
res = ndimage.generic_filter(array, random_function, size=3, mode='constant', cval=np.nan, extra_keywords={'mask': cross_mask}) 
print array 
print res 

결과 :

array: 
[[ 0 1 2 3 4] 
[ 5 6 7 8 9] 
[10 11 12 13 14] 
[15 16 17 18 19] 
[20 21 22 23 24]] 
res: 
[[ 1 6 7 8 3] 
[ 6 1 12 9 8] 
[11 10 7 8 9] 
[10 17 18 17 18] 
[15 20 21 18 19]] 
+0

이것은 정말로 흥미 롭습니다. 전체 배열 대신 무작위로 선택한 요소에이 필터를 적용 할 수 있어야합니다. –