包裹的2D阵列中子阵列的高效Numpy采样

时间:2015-05-14 10:46:21

标签: python arrays numpy

我有一个4x4阵列,想知道是否有办法在任何位置随机取样2x2方块,允许方块在到达边缘时缠绕。

例如:

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

start_point = 3

广场将为[[15, 12], [3,0]]

2 个答案:

答案 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是否为2D数组

答案 1 :(得分:1)

您可以使用带有'wrap'选项的Intent.getData()来获得输入数组的填充版本,该数组在行和列的末尾包含元素。最后,索引到填充数组以获得所需的输出。这是实施 -

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]])