numpy:元素的洗牌子集



我有一个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.1.13.0/reference/arrays.indexing.html,我发现上述使用的高级切片,它返回副本,而是视图。但是此副本被安置在现场,因此没有结果可以分配给原始数组。

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

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

另外,您 can 使用a[::a.shape[0]-1, ::a.shape[1]-1]

获取数组4个角的 view

然而,由于其结果是二维的numpy阵列,因此改组只会沿着第一个轴进行洗牌。

罪魁祸首是np.random.shuffle确实会更改成立数组,并且永远不会返回值,从而随机订购条目。您的代码更改了包含Corners的新临时数组,该数组已更改,但是您没有参考,因此您没有更改。结帐:

>>> 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重新分配角。并保重,我的示例中的角落是从已经洗牌的阵列a。

中获取的

最新更新