我有一個4x4陣列,並想知道是否有方法從任意位置隨機採樣一個2x2平方,從而允許在到達邊緣時方塊纏繞。包裝2D陣列中的子陣列的高效Numpy採樣
例如:
>> A = np.arange(16).reshape(4,-1)
>> start_point = A[0,3]
start_point = 3
方將[[15, 12], [3,0]]
我有一個4x4陣列,並想知道是否有方法從任意位置隨機採樣一個2x2平方,從而允許在到達邊緣時方塊纏繞。包裝2D陣列中的子陣列的高效Numpy採樣
例如:
>> A = np.arange(16).reshape(4,-1)
>> start_point = A[0,3]
start_point = 3
方將[[15, 12], [3,0]]
我全身(有點......)我的答案,允許矩形輸入數組 甚至矩形隨機抽樣
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
是一個二維數組
您可以使用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]])