numpy随机随机shuffle

Nic*_*ick 5 numpy shuffle

我有以下数组:

 a= array([[  1,  2, 3],
           [  1,  2, 3],
           [  1,  2, 3])
Run Code Online (Sandbox Code Playgroud)

我明白np.random,shuffle(a.T)将沿着行排列数组,但我需要的是它依赖于每一行的shuffe.怎么能在numpy中完成?速度至关重要,因为将有数百万行.

对于此特定问题,每行将包含相同的起始填充.

unu*_*tbu 7

import numpy as np
np.random.seed(2018)

def scramble(a, axis=-1):
    """
    Return an array with the values of `a` independently shuffled along the
    given axis
    """ 
    b = a.swapaxes(axis, -1)
    n = a.shape[axis]
    idx = np.random.choice(n, n, replace=False)
    b = b[..., idx]
    return b.swapaxes(axis, -1)

a = a = np.arange(4*9).reshape(4, 9)
# array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8],
#        [ 9, 10, 11, 12, 13, 14, 15, 16, 17],
#        [18, 19, 20, 21, 22, 23, 24, 25, 26],
#        [27, 28, 29, 30, 31, 32, 33, 34, 35]])

print(scramble(a, axis=1))
Run Code Online (Sandbox Code Playgroud)

产量

[[ 3  8  7  0  4  5  1  2  6]
 [12 17 16  9 13 14 10 11 15]
 [21 26 25 18 22 23 19 20 24]
 [30 35 34 27 31 32 28 29 33]]
Run Code Online (Sandbox Code Playgroud)

沿着0轴加扰:

print(scramble(a, axis=0))
Run Code Online (Sandbox Code Playgroud)

产量

[[18 19 20 21 22 23 24 25 26]
 [ 0  1  2  3  4  5  6  7  8]
 [27 28 29 30 31 32 33 34 35]
 [ 9 10 11 12 13 14 15 16 17]]
Run Code Online (Sandbox Code Playgroud)

这可以通过首先将目标轴与最后一个轴交换来实现:

b = a.swapaxes(axis, -1)
Run Code Online (Sandbox Code Playgroud)

这是用于标准化处理一个轴的代码的常用技巧.它将一般情况简化为处理最后一个轴的特定情况.由于在NumPy 1.10或更高版本中swapaxes返回视图,因此不涉及复制,因此调用swapaxes非常快.

现在我们可以为最后一个轴生成一个新的索引顺序:

n = a.shape[axis]
idx = np.random.choice(n, n, replace=False)
Run Code Online (Sandbox Code Playgroud)

现在我们可以随机播放b(独立于最后一个轴):

b = b[..., idx]
Run Code Online (Sandbox Code Playgroud)

然后反转swapaxes以返回一个a形状的结果:

return b.swapaxes(axis, -1)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,每行的随机播放都是相同的,由“idx”索引。您仍然没有对每一行进行不同的洗牌。 (3认同)
  • 这并不能回答问题。每行都以相同的方式进行洗牌。我可以通过简单的索引来实现这一点。 (2认同)