从二维 numpy 数组中采样

Sampling from a 2d numpy array

我想知道是否有一种从 2d numpy 数组中采样的合理有效的方法。如果我有一个通用数组:

dims = (4,4)
test_array = np.arange(np.prod(dims)).reshape(*dims)
test_array
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

然后我想随机将其中的两个元素设置为特定值(假设为 100)。我试过创建一个索引数组然后应用它:

sample_from = np.random.randint(low=0, high=5, size=(2,2))
sample_from
array([[0, 2],
       [1, 1]])

但是如果我尝试使用它来索引,它给了我一个稍微出乎意料的答案:

test_array[sample_from]
array([[[ 0,  1,  2,  3],
        [ 8,  9, 10, 11]],

       [[ 4,  5,  6,  7],
        [ 4,  5,  6,  7]]])

我所期望的(以及我想要的那种结果)是如果我直接输入索引数组:

test_array[[0,2],[1,1]] = 100
test_array

给予:

array([[  0, 100,   2,   3],
       [  4,   5,   6,   7],
       [  8, 100,  10,  11],
       [ 12,  13,  14,  15]])

感谢收到的任何帮助。

您可以使用 np.random.choice + np.unravel_index 直接分配给您的数组。

test_array[
    np.unravel_index(np.random.choice(np.prod(dims), 2, replace=False), dims)
] = 100