在子数组

时间:2015-05-15 19:42:24

标签: python numpy

我正在处理一个小的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.], ... ]来解决这个问题的快速方法?我可以求助于列表推导,但我不愿意。

2 个答案:

答案 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的答案,但为了完整起见,这是一个解决方法......

您可以分别从xxyy中进行选择,并将两个阵列堆叠在一起:

np.column_stack(( np.repeat(xx.flatten(), number.flatten()), np.repeat(xx.flatten(), number.flatten()) ))

这有点不太直观,但是它确实起作用(但Ashwini的确更好)