Numpy:shuffle元素的子集

时间:2018-04-26 18:54:39

标签: python numpy shuffle

我有一个2-D numpy-array,将其解释为网格,并希望置换元素的子集。 更准确地说,边缘应映射到边缘,角落映射到角落。

  • np.random.shuffle完成工作,任何元素的排列都很好。

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

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,我发现上面使用的是高级切片,它会返回一个副本而不是视图。 但是这个副本就位,因此没有结果分配给原始数组。

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

2 个答案:

答案 0 :(得分:3)

您可以使用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]])

此外,您可以使用a[::a.shape[0]-1, ::a.shape[1]-1]

获取数组4个角的视图

然而,由于那个结果是一个二维的numpy数组,改组只会沿着第一个轴进行随机播放。

答案 1 :(得分:1)

罪魁祸首是np.random.shuffle确实就地更改了数组,并且从不返回值,随机排序条目。您的代码更改了包含角的新数组和临时数组,这些数组已更改,但您没有引用它,因此您看不到任何更改。退房:

>>> import numpy as np 
>>> a = np.arange(16).reshape((4,4))
>>> a
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
>>> np.random.shuffle(a)
>>> a
array([[12, 13, 14, 15],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [ 0,  1,  2,  3]])
>>> np.random.shuffle(a)
>>> a
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [12, 13, 14, 15],
       [ 8,  9, 10, 11]])
>>> a[[0,0,-1,-1],[0,-1,0,-1]]
array([ 0,  3,  8, 11])
>>> np.random.shuffle(a[[0,0,-1,-1],[0,-1,0,-1]])
>>> b = a[[0,0,-1,-1],[0,-1,0,-1]]
>>> np.random.shuffle(b)
>>> b
array([ 0, 11,  8,  3])
>>>  

现在你只需要用b重新分配角落。请注意,我的例子中的角落是从已经洗过的阵列中取出来的。