我还是Numpy和Python的新手。我想知道在numpy数组中只有5%的值随机更改顺序的更有效方法是什么,并保留其他95%值的相同索引顺序?
假设我有以下100个整数元素的数组。
In [7]:a
Out[8]: array([ 2., 2., 2., 2., 1., 0., 2., 2., 1., 2., 1., 2., 2.,
2., 1., 2., 2., 2., 1., 2., 2., 2., 2., 1., 2., 1.,
2., 2., 1., 0., 2., 2., 2., 2., 2., 2., 1., 2., 1.,
1., 2., 1., 1., 1., 2., 2., 1., 2., 1., 2., 2., 1.,
0., 1., 2., 2., 1., 2., 2., 2., 2., 2., 0., 2., 1.,
2., 2., 2., 2., 1., 2., 2., 2., 2., 2., 2., 2., 2.,
1., 1., 2., 1., 2., 1., 2., 2., 2., 1., 1., 2., 2.,
1., 2., 2., 2., 1., 1., 2., 2., 1.])
如何使用python和numpy随机置换5%的值的顺序?
答案 0 :(得分:3)
您可以获取索引的5%样本,在这些索引处创建值的副本,随机重置值,然后重新分配。请注意,np.random.shuffle
是就地操作。
import numpy as np
a = np.array(
[ 2., 2., 2., 2., 1., 0., 2., 2., 1., 2., 1., 2., 2.,
2., 1., 2., 2., 2., 1., 2., 2., 2., 2., 1., 2., 1.,
2., 2., 1., 0., 2., 2., 2., 2., 2., 2., 1., 2., 1.,
1., 2., 1., 1., 1., 2., 2., 1., 2., 1., 2., 2., 1.,
0., 1., 2., 2., 1., 2., 2., 2., 2., 2., 0., 2., 1.,
2., 2., 2., 2., 1., 2., 2., 2., 2., 2., 2., 2., 2.,
1., 1., 2., 1., 2., 1., 2., 2., 2., 1., 1., 2., 2.,
1., 2., 2., 2., 1., 1., 2., 2., 1.])
ix_size = int(0.05 * len(a))
ix = np.random.choice(len(a), size=ix_size, replace=False)
b = a[ix]
np.random.shuffle(b)
a[ix] = b
答案 1 :(得分:1)
import numpy as np
array = ...
# how many positions to permute
nsamples = int(round(len(array)*0.05))
# select random positions
positions = np.random.choice(len(array), nsamples, replace=False)
# extract values at selected positions
sample = array[positions]
# shuffle the sample
np.random.shuffle(sample)
# apply changes to the original array
array[positions] = sample