python - Numpy:随机播放元素的子集
问题描述
我有一个二维 numpy 数组,将其解释为网格,并且想要置换元素的子集。更准确地说,应将边映射到边,将角映射到角。
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,我发现上面使用了Advanced Slicing,它返回一个副本,而不是一个视图。但是这个副本是就地洗牌的,所以没有结果要分配给原始数组。
所以问题是,我如何置换所选索引的元素?
解决方案
您可以使用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 数组,因此改组只会沿第一个轴进行改组。
推荐阅读
- laravel - Laravel Livewire 绑定模型 Carbon 属性
- javascript - 反应语义日期选择器禁用选择过去的日期
- html - 为 div 内的文本添加右填充
- android - RecyclerView is loading items , but not scrolling. Onclick does not work either
- windows - PowerShell - 重命名文件夹
- javascript - 如何删除一个对象并将其添加到javascript中的数组中?
- javascript - 如何在 Materialise 3-D carousel 中添加任何图像?
- google-sheets - 在 Google 表格中将分数转换为小数
- c - C Levenshtein 程序仅适用于 txt 和 pdf 文件
- spring-boot - 在骆驼弹性4J中包含/排除异常