Numpy 按行随机播放 3-D numpy 数组

Numpy shuffle 3-D numpy array by row

假设我有以下 3D 矩阵:

1 1 1

2 2 2

3 3 3

在它后面(第三维度):

一个一个

b b b

c c c

如果我是正确的定义如下:

import numpy as np
x = np.array([[[1,1,1], 
               [2,2,2], 
               [3,3,3]],
              [["a","a","a"],
               ["b","b","b"],
               ["c","c","c"]]])

我想按行随机打乱我的 3D 数组,变成这样:

2 2 2

1 1 1

3 3 3

落后:

b b b

一个一个

c c c

*请注意,a 始终属于 1,b 始终属于 2,c 始终属于 3(同一行)

如何实现?

使用np.random.shuffle:

import numpy as np

x = np.array([[[1,1,1], 
               [2,2,2], 
               [3,3,3]],
              [["a","a","a"],
               ["b","b","b"],
               ["c","c","c"]]])

ind = np.arange(x.shape[1])
np.random.shuffle(ind)

x[:, ind, :]

输出:

array([[['1', '1', '1'],
        ['3', '3', '3'],
        ['2', '2', '2']],

       [['a', 'a', 'a'],
        ['c', 'c', 'c'],
        ['b', 'b', 'b']]], dtype='<U21')

在将第二个轴作为第一个轴调出后简单地使用 np.random.shuffle,因为 shuffle 函数沿第一个轴工作并进行改组 in-place -

np.random.shuffle(x.swapaxes(0,1))

样本运行-

In [203]: x
Out[203]: 
array([[['1', '1', '1'],
        ['2', '2', '2'],
        ['3', '3', '3']],

       [['a', 'a', 'a'],
        ['b', 'b', 'b'],
        ['c', 'c', 'c']]], dtype='<U21')

In [204]: np.random.shuffle(x.swapaxes(0,1))

In [205]: x
Out[205]: 
array([[['3', '3', '3'],
        ['2', '2', '2'],
        ['1', '1', '1']],

       [['c', 'c', 'c'],
        ['b', 'b', 'b'],
        ['a', 'a', 'a']]], dtype='<U21')

正如我们在 .

中发现的那样,这应该非常有效

或者,另外两种排列轴的方法是 -

np.moveaxis(x,0,1)
x.transpose(1,0,2)