对于一个二维的Numpy数组,在每一行上应用相同的排列。

4

如果要对一维数组 A 进行排列,您可以运行以下代码:

import numpy as np
A = np.random.permutation(A)

我有一个二维数组,想要对每一行应用完全相同的排列。有没有办法让numpy为您指定这样做?


非常抱歉我表述不够清晰。每一行在应用置换之前应该具有相同的元素集合,但是您排列每一行中的元素的方式应该是相同的。因此,如果位置0的元素移动到位置4,则每一行都应该发生相同的情况。 - jsguy
1
换句话说,你想对A的列进行排列? - Warren Weckesser
3个回答

8

生成A中列数的随机排列,并索引到A的列中,如下所示 -

A[:,np.random.permutation(A.shape[1])]

样例运行 -

In [100]: A
Out[100]: 
array([[3, 5, 7, 4, 7],
       [2, 5, 2, 0, 3],
       [1, 4, 3, 8, 8]])

In [101]: A[:,np.random.permutation(A.shape[1])]
Out[101]: 
array([[7, 5, 7, 4, 3],
       [3, 5, 2, 0, 2],
       [8, 4, 3, 8, 1]])

你的方法似乎改变了行的值,例如在置换之前的第一行中我们没有2,但在此之后我们有了2。我希望有一种掩码方式,例如,如果第一行的一个元素在置换后从位置0移动到位置4,则第二行和所有其他行中位置0的元素也应该发生相同的变化。 - jsguy

3
实际上,您不需要这样做,根据文档的说明:
如果x是一个多维数组,则仅沿其第一个索引洗牌。
因此,以Divakar的数组为例:
a = np.array([
    [3, 5, 7, 4, 7],
    [2, 5, 2, 0, 3],
    [1, 4, 3, 8, 8]
])

您可以这样做:np.random.permutation(a),就会得到类似以下的结果:
array([[2, 5, 2, 0, 3],
       [3, 5, 7, 4, 7],
       [1, 4, 3, 8, 8]])

附注:如果您需要执行列置换 - 只需执行np.random.permutation(a.T).T。类似的方法也适用于多维数组。


1

这取决于您对每行的意思。

如果您想排列所有值(无论行和列),请将数组reshape为1d,然后进行排列,再reshape回2d。

如果您想对每行进行排列但不在不同列之间混洗元素,则需要遍历一个轴并调用permutation。

for i in range(len(A)):
    A[i] = np.random.permutation(A[i])

可能有更简短的方法,但这就是实现它的方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接