我有一个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]
然而,由于其结果是二维的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。