我正在处理涉及二进制模式的项目(此处np.arrays
为0和1)。
我想修改这些的随机子集并返回模式的几个更改版本,其中给定的一部分值已被更改(如map函数到固定大小的数组的随机子集)
例如:采用模式[0 0 1 0 1]
并评价0.2
,返回[[0 1 1 0 1] [1 0 1 0 1]]
似乎可以通过使用辅助数组并使用条件进行迭代,但是有一个" clean"这样做的方法?
提前致谢!
答案 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"