假设我有一个维度为r
的数组(n, m)
。我想改组那个数组的列。
如果我使用numpy.random.shuffle(r)
,它会改变行。我怎么才能洗牌?因此,第一列成为第二列,第三列成为第一列,等等。
示例:
输入:
array([[ 1, 20, 100],
[ 2, 31, 401],
[ 8, 11, 108]])
输出:
array([[ 20, 1, 100],
[ 31, 2, 401],
[ 11, 8, 108]])
答案 0 :(得分:17)
在问我想的时候,也许我可以改变转置阵列:
np.random.shuffle(np.transpose(r))
它看起来像是完成了这项工作。我很感激评论,知道这是否是实现这一目标的好方法。
答案 1 :(得分:6)
对于一般轴,您可以遵循以下模式:
>>> import numpy as np
>>>
>>> a = np.array([[ 1, 20, 100, 4],
... [ 2, 31, 401, 5],
... [ 8, 11, 108, 6]])
>>>
>>> print a[:, np.random.permutation(a.shape[1])]
[[ 4 1 20 100]
[ 5 2 31 401]
[ 6 8 11 108]]
>>>
>>> print a[np.random.permutation(a.shape[0]), :]
[[ 1 20 100 4]
[ 2 31 401 5]
[ 8 11 108 6]]
>>>
答案 2 :(得分:4)
所以,离你的答案更进一步:
编辑:我很容易误解这是如何工作的,所以我在每一步都插入了对矩阵状态的理解。
r == 1 2 3
4 5 6
6 7 8
r = np.transpose(r)
r == 1 4 6
2 5 7
3 6 8 # Columns are now rows
np.random.shuffle(r)
r == 2 5 7
3 6 8
1 4 6 # Columns-as-rows are shuffled
r = np.transpose(r)
r == 2 3 1
5 6 4
7 8 6 # Columns are columns again, shuffled.
然后将以适当的形状返回,并重新排列列。
矩阵转置的转置==那个矩阵,或者,[A ^ T] ^ T == A.所以,你需要在shuffle之后进行第二次转置(因为转置不是shuffle)以使它再次处于适当的形状。
编辑:OP的答案会跳过存储转置,而是让shuffle在r上运行,就像它一样。
答案 3 :(得分:2)
还有另一种方法,它不使用换位并且显然更快:
np.take(r, np.random.permutation(r.shape[1]), axis=1, out=r)
CPU 时间:用户 1.14 毫秒,系统:1.03 毫秒,总计:2.17 毫秒。挂墙时间:3.89 毫秒
其他答案中的方法:np.random.shuffle(r.T)
CPU 时间:用户 2.24 ms,系统:0 ns,总计:2.24 ms 挂墙时间:5.08 毫秒
我使用 r = np.arange(64*1000).reshape(64, 1000)
作为输入。
答案 4 :(得分:1)
一般情况下,如果你想沿轴i
洗牌一个numpy数组:
def shuffle(x, axis = 0):
n_axis = len(x.shape)
t = np.arange(n_axis)
t[0] = axis
t[axis] = 0
xt = np.transpose(x.copy(), t)
np.random.shuffle(xt)
shuffled_x = np.transpose(xt, t)
return shuffled_x
shuffle(array, axis=i)
答案 5 :(得分:0)
>>> print(s0)
>>> [[0. 1. 0. 1.]
[0. 1. 0. 0.]
[0. 1. 0. 1.]
[0. 0. 0. 1.]]
>>> print(np.random.permutation(s0.T).T)
>>> [[1. 0. 1. 0.]
[0. 0. 1. 0.]
[1. 0. 1. 0.]
[1. 0. 0. 0.]]
np.random.permutation(),进行行排列。