我正在处理一个小的2d拒绝采样功能,而且我遇到了np.repeat()
的问题。我希望能够提供我的函数rejection_sample_2d()
,x
值数组,y
值数组以及尺寸与{的大小相对应的2D概率分布数组{1}}和x
。到目前为止,我已经管理了以下内容:
y
def rejection_sample_2d(x, y, z, nper = 100):
'''
sample `nper` times from each bin of 2D PDF `z`
'''
import numpy as np
import numpy.random as r
#normalize
z /= z.sum()
mc = r.random(z.shape + (nper,))
selected = mc < z[:,:,np.newaxis]
number = selected.sum(axis = -1)
xx, yy = np.meshgrid(x, y)
coords = np.dstack((xx, yy))
return np.repeat(coords, number[:,:,np.newaxis])
是一个3d数组,但它可以被认为是一个2d坐标网格,我想构建另一个数组,例如coords
个实例{{1} }。
例如,让我们说
number[0,0]
在这种情况下,结果将是coords[0,0]
我看到了similar question,但是当我尝试将其扩展到更高的尺寸时,它并没有起作用。上面的函数在最后一行抛出以下错误:
coords = [ [ [0., 0.], [1., 0.], [2., 0.] ],
[ [0., 1.], [1., 1.], [2., 1.] ],
[ [0., 2.], [1., 2.], [2., 2.] ] ]
number = [ [ 1 , 1 , 2 ],
[ 3 , 2 , 3 ],
[ 4 , 4 , 5 ] ]
是否有(a)更好/更具维度的方法来解决这个问题,或者(b)使用[ [0., 0.], [1., 0.], [2., 0.], [2., 0.], ... ]
来解决这个问题的快速方法?我可以求助于列表推导,但我不愿意。
答案 0 :(得分:1)
这应该这样做:
>>> np.repeat(coords.reshape(-1, 2), number.ravel(), axis=0)
array([[ 0., 0.],
[ 1., 0.],
[ 2., 0.],
[ 2., 0.],
[ 0., 1.],
[ 0., 1.],
[ 0., 1.],
[ 1., 1.],
[ 1., 1.],
[ 2., 1.],
[ 2., 1.],
[ 2., 1.],
[ 0., 2.],
[ 0., 2.],
[ 0., 2.],
[ 0., 2.],
[ 1., 2.],
[ 1., 2.],
[ 1., 2.],
[ 1., 2.],
[ 2., 2.],
[ 2., 2.],
[ 2., 2.],
[ 2., 2.],
[ 2., 2.]])
答案 1 :(得分:0)
我喜欢@ Ashwini的答案,但为了完整起见,这是一个解决方法......
您可以分别从xx
和yy
中进行选择,并将两个阵列堆叠在一起:
np.column_stack(( np.repeat(xx.flatten(), number.flatten()), np.repeat(xx.flatten(), number.flatten()) ))
这有点不太直观,但是它确实起作用(但Ashwini的确更好)