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]]
만 나열 세포 자체보다 더 큰 수를 가진 사람들 .
좋아요? https://stackoverflow.com/a/34908879/8881141 또는이 정보가 필요하십니까? https://stackoverflow.com/a/2373689/8881141 – MrT
[ndarray에서 셀의 이웃을 찾는 방법?] (https : // stackoverflow.com/questions/34905274/how-to-find-the-neighbors-of-a-cell-in-an-ndarray) –
Thx, 이것이 원하는 방향으로 간다. 그러나 주기성을 주소 지정하지 않는다. – Marsl