2015-05-14 145 views
2

我有一個4x4陣列,並想知道是否有方法從任意位置隨機採樣一個2x2平方,從而允許在到達邊緣時方塊纏繞。包裝2D陣列中的子陣列的高效Numpy採樣

例如:

>> A = np.arange(16).reshape(4,-1) 
>> start_point = A[0,3] 

start_point = 3 

方將[[15, 12], [3,0]]

回答

2

我全身(有點......)我的答案,允許矩形輸入數組 甚至矩形隨機抽樣

def rand_sample(arr, nr, nc): 
    "sample a nr x nc submatrix starting from a random element of arr, with wrap" 
    r, c = arr.shape 
    i, j = np.random.randint(r), np.random.randint(c) 
    r = np.arange(i, i+nr) % r 
    c = np.arange(j, j+nc) % c 
    return arr[r][:,c] 

您可能要檢查arr是一個二維數組

1

您可以使用np.lib.pad'wrap'選項,以使輸入數組的填充版本在行和列的末尾包裹元素。最後,索引到填充數組以獲得所需的輸出。這裏的執行 -

import numpy as np 

# Input array and start row-col indices and neighbourhood extent 
A = np.arange(42).reshape(6,-1) 
start_pt = [0,3] # start_point 
N = 5 # neighbourhood extent 

# Pad boundary with wrapped elements 
A_pad = np.lib.pad(A, ((0,N-1),(0,N-1)), 'wrap') 

# Final output after indexing into padded array 
out = A_pad[start_pt[0]:start_pt[0]+N,start_pt[1]:start_pt[1]+N] 

採樣運行 -

In [192]: A 
Out[192]: 
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, 25, 26, 27], 
     [28, 29, 30, 31, 32, 33, 34], 
     [35, 36, 37, 38, 39, 40, 41]]) 

In [193]: start_pt 
Out[193]: [0, 3] 

In [194]: A_pad 
Out[194]: 
array([[ 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3], 
     [ 7, 8, 9, 10, 11, 12, 13, 7, 8, 9, 10], 
     [14, 15, 16, 17, 18, 19, 20, 14, 15, 16, 17], 
     [21, 22, 23, 24, 25, 26, 27, 21, 22, 23, 24], 
     [28, 29, 30, 31, 32, 33, 34, 28, 29, 30, 31], 
     [35, 36, 37, 38, 39, 40, 41, 35, 36, 37, 38], 
     [ 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3], 
     [ 7, 8, 9, 10, 11, 12, 13, 7, 8, 9, 10], 
     [14, 15, 16, 17, 18, 19, 20, 14, 15, 16, 17], 
     [21, 22, 23, 24, 25, 26, 27, 21, 22, 23, 24]]) 

In [195]: out 
Out[195]: 
array([[ 3, 4, 5, 6, 0], 
     [10, 11, 12, 13, 7], 
     [17, 18, 19, 20, 14], 
     [24, 25, 26, 27, 21], 
     [31, 32, 33, 34, 28]])