给一个百分比(5%)随机置换一个numpy数组的值

时间:2018-01-28 00:14:39

标签: python arrays numpy

我还是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%的值的顺序?

2 个答案:

答案 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