随机化一部分数组

时间:2016-03-08 16:44:46

标签: python numpy

我正在处理涉及二进制模式的项目(此处np.arrays为0和1)。 我想修改这些的随机子集并返回模式的几个更改版本,其中给定的一部分值已被更改(如map函数到固定大小的数组的随机子集) 例如:采用模式[0 0 1 0 1]并评价0.2,返回[[0 1 1 0 1] [1 0 1 0 1]]

似乎可以通过使用辅助数组并使用条件进行迭代,但是有一个" clean"这样做的方法?

提前致谢!

2 个答案:

答案 0 :(得分:0)

rate=0.2
repeats=5
seed=[0,0,1,0,1]
realizations=np.tile(seed,[repeats,1]) ^ np.random.binomial(1,rate,[repeats,len(seed)])

使用np.tile()从种子行生成矩阵。

np.random.binomial()以您要求的费率生成二项式掩码矩阵。

使用xor二元运算符^

应用掩码

编辑:

基于@Jared Goguen评论,如果你想改变20%的比特,你可以通过选择要随机改变的元素来详细说明一个掩码:

seed=[1,0,1,0,1]

rate=0.2
repeats=10

mask_list=[]

for _ in xrange(repeats):
  y=np.zeros(len(seed),np.int32)
  y[np.random.choice(len(seed),0.2*len(seed))]=1
  mask_list.append(y)

mask = np.vstack(mask_list)
realizations=np.tile(seed,[repeats,1]) ^ mask

答案 1 :(得分:0)

map函数也适用于布尔数组。您可以将子样本逻辑添加到您的函数中,如下所示:

import numpy as np
rate = 0.2
f = lambda x: np.random.choice((True, x),1,p=[rate,1-rate])[0]

a = np.array([0,0,1,0,1], dtype='bool')
map(f, a)
# This will output array a with on average 20% of the elements changed to "1"
# it can be slightly more or less than 20%, by chance.

或者您可以重写一个地图功能,如下所示:

import numpy as np

def map_bitarray(f, b, rate):
    '''
    maps function f on a random subset of b
    :param f: the function, should take a binary array of size <= len(b)
    :param b: the binary array
    :param rate: the fraction of elements that will be replaced
    :return: the modified binary array
    '''
    c = np.copy(b)
    num_elem = len(c)
    idx = np.random.choice(range(num_elem), num_elem*rate, replace=False)
    c[idx] = f(c[idx])
    return c

f = lambda x: True
b = np.array([0,0,1,0,1], dtype='bool')
map_bitarray(f, b, 0.2)
# This will output array b with exactly 20% of the elements changed to "1"