首页 > 解决方案 > Numpy:随机播放元素的子集

问题描述

我有一个二维 numpy 数组,将其解释为网格,并且想要置换元素的子集。更准确地说,应将边映射到边,将角映射到角。

我可以通过以下方式访问角落:

a = np.arange(16).reshape((4,4))
a[[0,0,-1,-1],[0,-1,0,-1]]

但是,当我打电话时

np.random.shuffle(a[[0,0,-1,-1],[0,-1,0,-1]])

数组没有改变。阅读https://docs.scipy.org/doc/numpy-1.13.0/reference/arrays.indexing.html,我发​​现上面使用了Advanced Slicing,它返回一个副本,而不是一个视图。但是这个副本是就地洗牌的,所以没有结果要分配给原始数组。

所以问题是,我如何置换所选索引的元素?

标签: pythonnumpyshuffle

解决方案


您可以使用np.random.permutation获取输入序列的随机副本,然后使用索引分配它:

In [19]: a = np.arange(16).reshape((4,4))

In [20]: a
Out[20]:
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

In [21]: a[[0,0,-1,-1],[0,-1,0,-1]] = np.random.permutation(a[[0,0,-1,-1],[0,-1,0,-1]])

In [22]: a
Out[22]:
array([[12,  1,  2, 15],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [ 0, 13, 14,  3]])

此外,您可以使用查看阵列的 4 个角a[::a.shape[0]-1, ::a.shape[1]-1]

但是,由于其结果是一个二维 numpy 数组,因此改组只会沿第一个轴进行改组。


推荐阅读