我想用条件洗牌一个 2d Numpy 数组。例如,仅随机播放非零值。
import numpy as np
a = np.arange(9).reshape((3,3))
a[2,2] = 0
# Shuffle non-zero values
# Example shuffle with only 0 staying in place
>>> a
array([[0, 5, 3],
[7, 2, 6],
[4, 1, 0]])
你可以做:
import numpy as np
a = np.arange(9).reshape((3,3))
a[2,2] = 0
c = a[a!=0]
np.random.shuffle(c)
a[a!=0] = c
a
# array([[0, 6, 5],
# [2, 3, 7],
# [4, 1, 0]])
如果你有不同的情况,你可以做:
import numpy as np
a = np.arange(9).reshape((3,3))
a[2,2] = 0
cond = a>3
c = a[cond]
np.random.shuffle(c)
a[cond] = c
更简洁的方法是:
a = np.arange(9).reshape((3,3))
a[2,2] = 0
a[a>3] = np.random.permutation(a[a>3])
这是执行此操作的一种方法:
import numpy as np
np.random.seed(0)
a = np.arange(9).reshape((3,3))
a[2,2] = 0
# Take a flattened version of the array
b = a.flatten() # If you do not need a copy use a.ravel()
# Find indices of non-zero values
idx, = np.nonzero(b)
# Shuffle those indices
b[idx] = b[np.random.permutation(idx)]
# Put back into original shape
b = b.reshape(a.shape)
print(b)
# [[0 7 3]
# [2 4 1]
# [6 5 0]]
如果要使用其他条件,只需替换:
idx, = np.nonzero(b)
跟:
idx, = np.where(condition)
例如,要仅随机排列偶数,您可以使用 b % 2 == 0
作为condition
。