如何根据数组中的位置更改Numpy.random.choice的p值?

如何根据数组中的位置更改Numpy.random.choice的p值?,numpy,random,Numpy,Random,我有一个大小为nxn的3D阵列。我想用随机布尔值填充这个数组,我可以这样做: a = np.random.choice([False,True],size=(N,N,N)) 但是,我希望选择True或False的可能性或p值基于元素在数组中的位置。我想也许我可以用p-value参数来实现这一点,但只有这样才能为整个数组选择True/False的频率 有没有办法为整个N,N,N数组设置特定的p值?我猜这相当于一个N,N,N,2数组,额外的2表示p值为False,p值为True,尽管p_True=

我有一个大小为nxn的3D阵列。我想用随机布尔值填充这个数组,我可以这样做:

a = np.random.choice([False,True],size=(N,N,N))
但是,我希望选择True或False的可能性或p值基于元素在数组中的位置。我想也许我可以用p-value参数来实现这一点,但只有这样才能为整个数组选择True/False的频率

有没有办法为整个N,N,N数组设置特定的p值?我猜这相当于一个N,N,N,2数组,额外的2表示p值为False,p值为True,尽管p_True=1-p_False。我觉得有一种更简单的方法,我没有想到

编辑: 假设我想创建一个简单的数组,a,形状为1,2,只有两个元素,但是是多维的。我想用True/False填充这两个元素。我有另一个数组,填充了似然或p值,我希望这些元素为False,比如p_False,其中p_False.shape=1,2。假设我希望第一个元素有25%的几率为False,但是第二个元素有50%的几率为False,那么p_False=np.array[0.25,0.5]

我尝试了以下几点:

a = np.random.choice([[False,True],[False,True]],p=[[.25,.75],[.5,.5]])
但是我得到了一个ValueError:a必须是一维的。

使用二项式方法,在[0,1]中使用一个数字数组。下面是一个示例,根据随机选择的概率将每个元素设置为0或1:

import numpy
gen=numpy.random.Generator(numpy.random.PCG64())
ret=gen.binomial(1, gen.uniform(size=(3, 3, 3)))
如果您希望每个项目为真或假,而不是0或1,恐怕我不知道如何做到这一点

请注意,numpy.random.Generator是。建议您使用最新版本的NumPy;同时,您可以使用以下各项:

import numpy
ret=numpy.random.binomial(1, numpy.random.uniform(size=(3, 3, 3)))

要生成具有不同概率的数组,可以使用以下代码:

# define an initial value of N
N = 512

# generate an array of probabilities. You can eventually build your own, since the size is respected
prob_array = np.array((range(0,N*N*N)))

# rescale the probabilities between 0 and 1
prob_array = (prob_array - np.min(prob_array)) / (np.max(prob_array) - np.min(prob_array))

# generate the random based on the probabilities, cast to booleans and reshape
np.reshape(np.array(np.random.binomial(1, p=prob_array, size=N*N*N), dtype=bool), (N,N,N))
这将生成一个数组,开始时有很多假,最后有很多真:

array([[[False, False, False, ..., False, False, False],
        [False, False, False, ..., False, False, False],
        [False, False, False, ..., False, False, False],
        ...,
        [False, False, False, ..., False, False, False],
        [False, False, False, ..., False, False, False],
        [False, False, False, ..., False, False, False]],

       ...,


       [[ True,  True,  True, ...,  True,  True,  True],
        [ True,  True,  True, ...,  True,  True,  True],
        [ True,  True,  True, ...,  True,  True,  True],
        ...,
        [ True,  True,  True, ...,  True,  True,  True],
        [ True,  True,  True, ...,  True,  True,  True],
        [ True,  True,  True, ...,  True,  True,  True]]])

你能详细说明基于元素在数组中的位置的方法吗?也许可以使用一个小的2D N,N数组来演示?所以这看起来像是python在数组的每个元素上循环,对吗?我的实际NXN阵列的大小可能是512x512x512,因此可能会比较慢。我尝试使用N=64并不断得到错误:ValueError:概率不是非负的。当N>5时出现此错误。另外,当N=5时,我总是得到相同的答案,前四行都是真的,第五行都是假的。是的,对于一个大的N来说,它可能很慢。产生错误是因为NNN大于100,所以大于100的1-元素将产生一个负概率,什么是不可能的。更新以剪裁概率并生成没有循环的数据。看起来生成器可能是新的。我有Numpy 1.15.1,但它似乎没有。我发布了这段代码,所以我想要一些不需要更新Numpy版本的东西。是否有一个替换为say RandomState或其他东西?是的;发电机是在Numpy 1.7中引入的。建议您使用最新版本的Numpy;同时,您可以使用numpy.random.binomial/.uniform。