在numpy中置换每列内容的最佳方法

2024-09-27 09:34:48 发布

您现在位置:Python中文网/ 问答频道 /正文

在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]])

Tags: to方法numpy内容npcolumn数组array
2条回答

如果数组是多维的,^{}默认情况下沿第一个轴(列)排列:

>>> np.random.permutation(arr)
array([[ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [ 0,  1,  2,  3],
       [12, 13, 14, 15]])

但是,这会洗牌行索引,因此每个列具有相同的(随机)顺序。在

独立洗牌每个列的最简单方法可以是循环遍历这些列,然后使用^{}在适当的位置洗牌每个列:

^{pr2}$

例如,它给出了:

array([[12,  1, 14, 11],
       [ 4,  9, 10,  7],
       [ 8,  5,  6, 15],
       [ 0, 13,  2,  3]])

如果您有一个非常大的数组,而您不想复制它,因为每个列的排列都是在适当的地方完成的,那么这个方法非常有用。另一方面,即使是简单的Python循环也可能非常慢,并且有更快的numy方法,比如@jme提供的方法。在

另一种方法是:

def permute_columns(x):
    ix_i = np.random.sample(x.shape).argsort(axis=0)
    ix_j = np.tile(np.arange(x.shape[1]), (x.shape[0], 1))
    return x[ix_i, ix_j]

快速测试:

^{pr2}$

其思想是生成一组随机数,然后在每个列中独立地argsort。这将产生每列索引的随机排列。在

注意,这具有次优的渐近时间复杂度,因为排序对于大小为m x n的数组需要时间O(n m log m)。但是,由于Python的for循环非常慢,所以除了非常高的矩阵之外,实际上所有的矩阵都能获得更好的性能。在

相关问题 更多 >

    热门问题