在numpy数组中有效地置换每个列的内容的最佳方法是什么?在
我有的是:
>>> arr = np.arange(16).reshape((4, 4))
>>> arr
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
>> # Shuffle each column independently to obtain something like
array([[ 8, 5, 10, 7],
[ 12, 1, 6, 3],
[ 4, 9, 14, 11],
[ 0, 13, 2, 15]])
如果数组是多维的,^{} 默认情况下沿第一个轴(列)排列:
但是,这会洗牌行索引,因此每个列具有相同的(随机)顺序。在
独立洗牌每个列的最简单方法可以是循环遍历这些列,然后使用^{} 在适当的位置洗牌每个列:
^{pr2}$例如,它给出了:
如果您有一个非常大的数组,而您不想复制它,因为每个列的排列都是在适当的地方完成的,那么这个方法非常有用。另一方面,即使是简单的Python循环也可能非常慢,并且有更快的numy方法,比如@jme提供的方法。在
另一种方法是:
快速测试:
^{pr2}$其思想是生成一组随机数,然后在每个列中独立地
argsort
。这将产生每列索引的随机排列。在注意,这具有次优的渐近时间复杂度,因为排序对于大小为
m x n
的数组需要时间O(n m log m)
。但是,由于Python的for
循环非常慢,所以除了非常高的矩阵之外,实际上所有的矩阵都能获得更好的性能。在相关问题 更多 >
编程相关推荐