我有以下数组:
a= array([[ 1, 2, 3],
[ 1, 2, 3],
[ 1, 2, 3])
Run Code Online (Sandbox Code Playgroud)
我明白np.random,shuffle(a.T)将沿着行排列数组,但我需要的是它依赖于每一行的shuffe.怎么能在numpy中完成?速度至关重要,因为将有数百万行.
对于此特定问题,每行将包含相同的起始填充.
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)